快速业务通道

信号量实现进程同步

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-23
  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. #define MAXSEM 5 /*声明三个信号量ID*/
  10. int fullid;
  11. int emptyid;
  12. int mutxid;
  13. int main(){
  14. struct sembuf P,V;
  15. union semun arg; /* 声明共享主存*/
  16. int *array;
  17. int *sum;
  18. int *set;
  19. int *get; /*将array、sum、set、get映射到共享主存*/
  20. array=( 拥有帝国一切,皆有可能。欢迎访问phome.netint *)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("semctl setval error");
  31. arg.val=MAXSEM;
  32. if(semctl(emptyid,0,SETVAL,arg)==-1)
  33. perror("semctl setval error"); 拥有帝国一切,皆有可能。欢迎访问phome.net
  34. arg.val=1;
  35. if(semctl(mutxid,0,SETVAL,arg)==-1)
  36. perror("semctl setval error"); /*初始化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. int i=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. 拥有帝国一切,皆有可能。欢迎访问phome.net 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("The ConmsumerA Get Number %d\n",array[(*get)%MAXSEM]);
  65. (*get) ;
  66. if(get==100)
  67. printf("The sum is %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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号