首页 > 系统 > Linux > 正文

Linux下共享内存+信号量实现

2024-06-28 13:26:12
字体:
来源:转载
供稿:网友
linux下共享内存+信号量实现

sem1.c

 1 #include"unistd.h" 2 #include"string.h" 3 #include"stdio.h" 4 #include"stdlib.h" 5 #include"linux/types.h" 6 #include"linux/sem.h" 7 #include"linux/ipc.h" 8 #include"linux/shm.h" 9 #include"error.h"10 int main()11 {12     key_t sem_key1=10086,sem_key2=10087,shm_key=10088;13     int mutexid1,mutexid2;14     int shmid=0,count=0,*addr,j=0,temp=0;15     union semun arg1,arg2;16     struct sembuf P,V;17     /* define  P   V Operation*/18     P.sem_num=0;19     P.sem_op=-1;20     P.sem_flg=SEM_UNDO;21     V.sem_num=0;22     V.sem_op=1;23     V.sem_flg=SEM_UNDO;24     arg1.val=4;25     arg2.val=0;26 27 28     mutexid1=semget(sem_key1,1,0666|IPC_CREAT);29     mutexid2=semget(sem_key2,1,0666|IPC_CREAT);30     semctl(mutexid1,0,SETVAL,arg1);31     semctl(mutexid2,0,SETVAL,arg2);32 33 34     shmid=shmget(shm_key,sizeof(int)*7,IPC_CREAT|0600);35     addr=(int *)shmat(shmid,NULL,0);//init share memory36     *(addr)=3;37     *(addr+1)=3;38     *(addr+2)=0;39     shmdt(addr);40     PRintf("         TIPS: iput/"-1/" to stop input num./n/n");41     while(1)42     {43 44 45         /**************************************************/46 47         semop(mutexid1,&P,1);48 49 50         shmid=shmget(shm_key,sizeof(int)*7,IPC_CREAT|0600);51         addr=(int *)shmat(shmid,NULL,0);//init share memory52         j=*(addr+1);53         count=*(addr+2);54         if(j==7)j=3;55 56         printf("Please input data:  ");57         scanf("%d",&temp);58         printf("/n");59         *(addr+j)=temp;60         printf("%d   wrrite sucess./n/n",*(addr+j));61         if(*(addr+j)==-1)62         {63             shmdt(addr);64             semop(mutexid2,&V,1);65             return 0;66         }67         j++;68         count++;69         *(addr+1)=j;70         *(addr+2)=count;71         shmdt(addr);72 73 74         semop(mutexid2,&V,1);75 76     /**************************************************/77     }78     return 0;79 }

sem2.c

 1 #include"unistd.h" 2 #include"stdio.h" 3 #include"stdlib.h" 4 #include"linux/types.h" 5 #include"linux/sem.h" 6 #include"linux/ipc.h" 7 #include"linux/shm.h" 8 #include"error.h" 9 int main()10 {11     key_t sem_key1=10086,sem_key2=10087,shm_key=10088;12     int mutexid1,mutexid2;13     int shmid=0,count=0,*addr,i=0;14     union semun arg;    15     struct sembuf P,V;16     /* define  P   V operation*/17     P.sem_num=0;18     P.sem_op=-1;19     P.sem_flg=SEM_UNDO;20     V.sem_num=0;21     V.sem_op=1;22     V.sem_flg=SEM_UNDO;23 24 25     mutexid1=semget(sem_key1,1,0666|IPC_CREAT);26     mutexid2=semget(sem_key2,1,0666|IPC_CREAT);27 28 29 30 31 32     while(1)33     {34 35 36 37     /***********************************************/        38 39     semop(mutexid2,&P,1);40 41     shmid=shmget(shm_key,sizeof(int)*7,IPC_CREAT|0600);42     addr=(int *)shmat(shmid,NULL,0);//init share memory43     i=*(addr);44     count=*(addr+2);45     if(i==7)i=3;46 47 48     printf("Read  data....   ");49     printf("%d/n",*(addr+i));50     if(*(addr+i)==-1)51     {    52         shmdt(addr);53         shmctl(shmid,IPC_RMID,NULL);54         semctl(mutexid1,0,IPC_RMID,0);55         semctl(mutexid2,0,IPC_RMID,0);56         return 0;57     }58     i++;59     count--;60     *(addr)=i;61     *(addr+2)=count;62     shmdt(addr);63     64     semop(mutexid1,&V,1);65 }66 /***********************************************/        67     return 0;68 }

在gcc下需要注意Linux和sys两个头文件位置的选择,否则会出现错误。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表