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两个头文件位置的选择,否则会出现错误。
新闻热点
疑难解答