信号量実現プロセス同期
8691 ワード
- #include<sys/mman.h>
- #include<sys/types.h>
- #include<linux/sem.h>
- #include<fcntl.h>
- #include<unistd.h>
- #include<stdio.h>
- #include<errno.h>
- #include<time.h>
- #defineMAXSEM5/* ID*/
- intfullid;
- intemptyid;
- intmutxid;
- intmain(){
- structsembufP,V;
- unionsemunarg;/* */
- int*array;
- int*sum;
- int*set;
- int*get;/* array、sum、set、get */
- array=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int)*MAXSEM,IPC_CREAT|0666),0,0);
- sum=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
- set=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
- get=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
- *get=0;/* fullid、emptyid mutxid*/
-
- fullid=semget(IPC_PRIVATE,0666|IPC_CREAT);
- emptyid=semget(IPC_PRIVATE,0666|IPC_CREAT);
- mutxid=semget(IPC_PRIVATE,0666|IPC_CREAT);/* */
- arg.val=0;
- if(semctl(fullid,0,SETVAL,arg)==-1)
- perror("semctlsetvalerror");
- arg.val=MAXSEM;
- if(semctl(emptyid,0,SETVAL,arg)==-1)
- perror("semctlsetvalerror");
- arg.val=1;
- if(semctl(mutxid,0,SETVAL,arg)==-1)
- perror("semctlsetvalerror");/* PV*/
- P.sem_num=0;
- P.sem_op=-1;
- P.sem_flg=SEM_UNDO;
- V.sem_num=0;
- V.sem_op=1;
- V.sem_flg=SEM_UNDO;/* */
- if(fork()==0){
- inti=0;
- *set=0;
- while(i<100){
- semop(emptyid,&P,1);
- semop(mutxid,&P,1);// emptyid、mutxid P
- array[(*set)%MAXSEM]=i+1;
- (*set)++;
- semop(mutxid,&V,1);// emptyid、mutxid V
- semop(fullid,&V,1);//
- i++;}
- sleep(3);
- printf("
");
- exit(0);
- }else{/* */
- if(fork()==0){while(1){
- semop(fullid,&P,1);// emptyid、mutxid P
- semop(mutxid,&P,1);//
- if(*get==100)
- break;
- *sum+=array[(*get)%MAXSEM];
- printf("TheConmsumerAGetNumber%d
",array[(*get)%MAXSEM]);
- (*get)++;
- if(get==100)
- printf("Thesumis%d
",sum);
- semop(mutxid,&V,1);
- semop(emptyid,&V,1);
- sleep(1);}
- printf("
");
- exit(0);}else{/* B*/
- if(fork()==0){
- while(1){
- semop(fullid,&P,1);// emptyid、mutxid P
- semop(mutxid,&P,1);
- if(*get==100)
- break;
- *sum+=array[(*get)%MAXSEM];
- printf("TheConmsumerBGetNumber%d
",array[(*get)%MAXSEM]);
- (*get)++;
- if(get==100)
- printf("Thesumis%d
",sum);
- semop(mutxid,&V,1);
- semop(emptyid,&V,1);
- sleep(1);}
- printf(" B !
");
- exit(0);
- }
- }
- }
- }
この文書は「アバンダ」ブログから出ています.この出典http://shamrock.blog.51cto.com/2079212/724992は必ず保持してください.