信号量实现进程同步

 
  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("生产者结束\n");
  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\n",array[(*get)%MAXSEM]);
  65. (*get)++;
  66. if(get==100)
  67. printf("Thesumis%d\n",sum);
  68. semop(mutxid,&V,1);
  69. semop(emptyid,&V,1);
  70. sleep(1);}
  71. printf("消费者结束\n");
  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\n",array[(*get)%MAXSEM]);
  81. (*get)++;
  82. if(get==100)
  83. printf("Thesumis%d\n",sum);
  84. semop(mutxid,&V,1);
  85. semop(emptyid,&V,1);
  86. sleep(1);}
  87. printf("消费者B结束!\n");
  88. exit(0);
  89. }
  90. }
  91. }
  92. }

本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/724992

你可能感兴趣的:(信号量)