信号量実現プロセス同期



 
  1. #include<sys/mman.h>
  2. #include<sys/types.h>
  3. #include<linux/sem.h>
  4. #include<fcntl.h>
  5. #include<unistd.h>
  6. #include<stdio.h>
  7. #include<errno.h>
  8. #include<time.h>
  9. #defineMAXSEM5/* ID*/
  10. intfullid;
  11. intemptyid;
  12. intmutxid;
  13. intmain(){
  14. structsembufP,V;
  15. unionsemunarg;/* */
  16. int*array;
  17. int*sum;
  18. int*set;
  19. int*get;/* array、sum、set、get */
  20. array=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int)*MAXSEM,IPC_CREAT|0666),0,0);
  21. sum=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
  22. set=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
  23. get=(int*)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0);
  24. *get=0;/* fullid、emptyid mutxid*/
  25. fullid=semget(IPC_PRIVATE,0666|IPC_CREAT);
  26. emptyid=semget(IPC_PRIVATE,0666|IPC_CREAT);
  27. mutxid=semget(IPC_PRIVATE,0666|IPC_CREAT);/* */
  28. arg.val=0;
  29. if(semctl(fullid,0,SETVAL,arg)==-1)
  30. perror("semctlsetvalerror");
  31. arg.val=MAXSEM;
  32. if(semctl(emptyid,0,SETVAL,arg)==-1)
  33. perror("semctlsetvalerror");
  34. arg.val=1;
  35. if(semctl(mutxid,0,SETVAL,arg)==-1)
  36. perror("semctlsetvalerror");/* PV*/
  37. P.sem_num=0;
  38. P.sem_op=-1;
  39. P.sem_flg=SEM_UNDO;
  40. V.sem_num=0;
  41. V.sem_op=1;
  42. V.sem_flg=SEM_UNDO;/* */
  43. if(fork()==0){
  44. inti=0;
  45. *set=0;
  46. while(i<100){
  47. semop(emptyid,&P,1);
  48. semop(mutxid,&P,1);// emptyid、mutxid P
  49. array[(*set)%MAXSEM]=i+1;
  50. (*set)++;
  51. semop(mutxid,&V,1);// emptyid、mutxid V
  52. semop(fullid,&V,1);//
  53. i++;}
  54. sleep(3);
  55. printf("
    "
    );
  56. exit(0);
  57. }else{/* */
  58. if(fork()==0){while(1){
  59. semop(fullid,&P,1);// emptyid、mutxid P
  60. semop(mutxid,&P,1);//
  61. if(*get==100)
  62. break;
  63. *sum+=array[(*get)%MAXSEM];
  64. printf("TheConmsumerAGetNumber%d
    "
    ,array[(*get)%MAXSEM]);
  65. (*get)++;
  66. if(get==100)
  67. printf("Thesumis%d
    "
    ,sum);
  68. semop(mutxid,&V,1);
  69. semop(emptyid,&V,1);
  70. sleep(1);}
  71. printf("
    "
    );
  72. exit(0);}else{/* B*/
  73. if(fork()==0){
  74. while(1){
  75. semop(fullid,&P,1);// emptyid、mutxid P
  76. semop(mutxid,&P,1);
  77. if(*get==100)
  78. break;
  79. *sum+=array[(*get)%MAXSEM];
  80. printf("TheConmsumerBGetNumber%d
    "
    ,array[(*get)%MAXSEM]);
  81. (*get)++;
  82. if(get==100)
  83. printf("Thesumis%d
    "
    ,sum);
  84. semop(mutxid,&V,1);
  85. semop(emptyid,&V,1);
  86. sleep(1);}
  87. printf(" B !
    "
    );
  88. exit(0);
  89. }
  90. }
  91. }
  92. }

この文書は「アバンダ」ブログから出ています.この出典http://shamrock.blog.51cto.com/2079212/724992は必ず保持してください.