Linux下共享内存+信号量实现
时间:2014-05-26 00:03:18
收藏:0
阅读:583
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 memory 36 *(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 memory 52 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 memory 43 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两个头文件位置的选择,否则会出现错误。
评论(0)