设为首页 加入收藏

TOP

C小程序 - 信号量(一)
2012-11-03 14:23:16 来源: 作者: 【 】 浏览:1898
Tags:程序   信号

  server.c
  
  #include <stdio.h>
  
  #include <pthread.h>
  
  #include <sys/types.h>
  
  #include <sys/sem.h>
  
  #include <time.h>
  
  #define TIME_SEM_KEY 500
  
  union semun { int val ; struct semid_ds *buf ; ushort *array; };
  
  int semset_id; /* global for cleanup() */
  
  main()
  
  {
  
  union semun initval;
  
  struct sembuf actions; /* action set */
  
  int i ;
  
  semset_id = semget( TIME_SEM_KEY, 1, (0666|IPC_CREAT|IPC_EXCL) );
  
  //1表示创建一个信号量
  
  //IPC_CREAT   如果共享内存不存在,则创建一个共享内存,否则打开操作。
  
  //IPC_EXCL只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。
  
  initval.val = 1;
  
  semctl(semset_id, 0, SETVAL, initval); //0表示信号量集合里面的特定信号量的号码,从0开始
  
  //SETVAL 表示给信号量设置初始值,即initval.val
  
  printf(“server begin\n”);
  
  printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
  
  actions.sem_num = 0;
  
  actions.sem_flg = SEM_UNDO; //使用SEM_UNDO的作用是,-1后加锁,如果程序意外退出,系统则会恢复此信号量                                    //,否则其他进程将一直阻塞在这个被锁的信号量这里。
  
  actions.sem_op = -1 ;
  
  semop( semset_id, &actions, 1); //-1操作后,信号量变为0
  
  printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
  
  for(i=0; i < 5; i++)
  
  {
  
  printf(“server sleep %d\n”, i);
  
  printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
  
  sleep(i);                            //这时候启动client进程,client进程获得不到信号量,被阻塞
  
  }
  
  actions.sem_num = 0;
  
  actions.sem_flg = SEM_UNDO;
  
  actions.sem_op  = +1 ;
  
  semop( semset_id, &actions, 1);
  
  sleep(2);                                //这时候client进程才获得了信号量
  
  printf(“server sem num = %d\n”,semctl(semset_id, 0, GETVAL, 0));
  
  semctl(semset_id, 0, IPC_RMID, initval);
  
  }
  
  client.c
  
  #include <stdio.h>
  
  #include <pthread.h>
  
  #include <sys/types.h>
  
  #include <sys/sem.h>
  
  #include <time.h>
  
  #define TIME_SEM_KEY 500
  
  union semun { int val ; struct semid_ds *buf ; ushort *array; };
  
  int    seg_id, semset_id;            /* global for cleanup()    */
  
  main()
  
  {

   

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C小程序 - 分析一个多.. 下一篇C语言内存池使用模型

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: