📄 share_memory.c
字号:
/*this program must be running under Linux*/
/*my_lock.c*/
#include <sys/types.h> /* basic system data types */
#include <fcntl.h> /* for nonblocking */
#include <limits.h> /* PIPE_BUF */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#define __USE_GNU
#include <sys/sem.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <errno.h>
#define LOCK_PATH "/tmp/semlock"
#define MAX_TRIES 60
/*#define SVSEM_MODE (SEM_R | SEM_A | SEM_R>>3 | SEM_R>>6)*/
#define SVSEM_MODE 0644
union semun { /* define union for semctl() */
int val;
struct semid_ds *buf;
unsigned short *array;
};
int semid,initflag=0;
struct sembuf postop,waitop;
void my_lock()
{
int oflg,i;
union semun arg;
struct semid_ds seminfo;
if (initflag==0){
oflg=IPC_CREAT|IPC_EXCL|SVSEM_MODE;
if((semid=semget(ftok(LOCK_PATH,0),1,oflg))>=0){
arg.val=1;
semctl(semid,0,SETVAL,arg);//set init value
}else if(errno==EEXIST){
semid=semget(ftok(LOCK_PATH,0),1,SVSEM_MODE);
arg.buf=&seminfo;
for(i=0;i<MAX_TRIES;i++){
semctl(semid,0,IPC_STAT,arg);
if(arg.buf->sem_otime!=0)
goto init;
sleep(1);
}
fprintf(stderr,"semget OK, but semaphore not initialized.\n");
exit(1);
}else{
fprintf(stderr,"semget error.\n");
exit(1);
}
init:
initflag=1;
postop.sem_num=0;
postop.sem_op=1;
postop.sem_flg=SEM_UNDO;
waitop.sem_num=0;
waitop.sem_op=-1;
waitop.sem_flg=SEM_UNDO;
}
semop(semid,&waitop,1);
}
/*my_unlock.c*/
void my_unlock()
{
semop(semid,&postop,1);
}
/*****************************************************/
/*share memory f5.c source file*/
/*#include <stdio.h>*/
/*#include <stdlib.h>*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SIZE 64*64 /*size of memory*/
int semid,initflag;
struct sembuf postop,waitop;
void my_lock();
void my_unlock();
struct shmdata{
int type;
int val1;
int val2;
};
main()
{
int semid,shmid;
int key;
void *addr;
struct shmdata *shmdata;
key=ftok(".",100); //ftok():use the current path and 100 to make out a key of key_t type, used by shmget()
/*create a share memory*/
if( (shmid=shmget(key,SIZE,IPC_CREAT|0666)) < 0 )
{
printf("shmget error");
exit(1);
}
/*get the addres and write data to it*/
addr=shmat(shmid,0,0);
shmdata=(struct shmdata*)addr;
my_lock();
shmdata->type=1000;
shmdata->val1=123;
shmdata->val2=456;
my_unlock();
if(!fork())
{
for(;;){
my_lock();
if(shmdata->type==1000)
{
shmdata->type=1001;
shmdata->val1=456;
shmdata->val2=123;
my_unlock();
exit(0);
}
my_unlock();
}
}else{
/*the parent process read data from share memory*/
for(;;){
my_lock();
if(shmdata->type==1001){
printf("val1=%d\nval2=%d \n",shmdata->val1,shmdata->val2);
my_unlock();
break;
}
my_unlock();
}
}
}
/*程序在Linux下运行 */
/*******output:**************************************/
/****** val1=456 ************************************/
/****** val2=123 ************************************/
/****************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -