Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109344
  • 博文数量: 74
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 757
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-20 22:42
个人简介

相信生命中的无限潜能

文章分类

全部博文(74)

文章存档

2016年(1)

2015年(30)

2014年(30)

2013年(13)

我的朋友

分类: C/C++

2014-02-23 16:09:19


  1. /*信号量
  2.  * 它是一个计数器,用于多进程对共享数据对象的访问 一个进程控制另一个进程
  3.  *
  4.  *为了获得共享资源,进程需要执行下列操作
  5.  * 1.测试控制资源的信号量
  6.  * 2.若此信号量的值为正,则进程可以使用该资源,进程信号量值减一,表示他使用了一个资源单位
  7.  * 3.若此信号量的值为0,则进程进入休眠状态,直至信号量值大于0,进程被唤醒后,它返回至第一个步
  8.  */

  9. /*获得一个信号量的ID,要调用的函数是semget
  10.  * int semget(key_t key, int nsems, int flag);
  11.  * 返回值:若成功返回信号量ID,若出错返回-1
  12.  * 参数key为 key=ftok(".",88);
  13.  * 参数flag为IPC_CREAT|IPC_EXCL|0666
  14.  * nsems是该集合中的信号数量,如果创建一个新集合,则必须指定nsems,如果引用一个现存的集合,则将nsems指定为0
  15.  */

  16. /*初始化指定信号量的值 semctl
  17.  * int semctl(int semid, int semnum, int cmd,....union semnu arg)
  18.  * 参数semid 信号量ID
  19.  * 参数semnum 定义的信号量的数量的第几个 (下标值)
  20.  * 参数cmd 为宏 SETVAL修改它的值
  21.  */


  22. /*根据信号量阻塞还是解除阻塞semop()
  23.  * int semop(int semid,struct sembuf semoparray[], size_t nops)
  24.  * 返回值:成功返回0 出错返回-1
  25.  */



  1. //A.C
  2. #include <stdio.h>
  3. #include <sys/sem.h>
  4. #include <sys/ipc.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. int main()
  8. {
  9.     key_t key;
  10.     /*信号量ID*/
  11.     int semid;
  12.     /*创建信号量*/
  13.     key=ftok(".",88);
  14.     if(key==-1)printf("ftok err:%m\n"),exit(-1);

  15.     semid = semget(key,1,IPC_CREAT|IPC_EXCL|0666);
  16.     //semid = semget(key,1,0);
  17.     if(semid==-1)printf("get err:%m\n"),exit(-1);
  18.     printf("semid=%d\n",semid);
  19.     /*初始化信号量semctl*/
  20.         /*定义一个联合*/
  21.     union semun{
  22.         int val;
  23.         struct semid_ds *buf;
  24.         unsigned short *array;
  25.         struct seminfo *_buf;
  26.     };
  27.         /*定义一个初始化的值*/
  28.     int r;
  29.     union semun v;
  30.     v.val = 2;/*需要阻塞几次:*/
  31.     r = semctl(semid,0,SETVAL,v);/*设置信号量*/
  32.     if(r==-1)printf("初始失败\n"),exit(-1);
  33.     /*对信号量进行阻塞操作semop*/
  34.         /*定义操作*/
  35.     struct sembuf op[2];/*定义了两个操作*/
  36.     op[0].sem_num = 0;/*信号量的下标*/
  37.     op[0].sem_op = -1;/*阻塞操作就是减操作*/
  38.     op[0].sem_flg = 0;/**/
  39.     while(1)
  40.     {
  41.         r=semop(semid,op,1);
  42.         printf("解除阻塞\n");
  43.     }
  44.     /*删除信号量*/
  45.     return 0;
  46. }


  1. B.c
  2. #include <stdio.h>
  3. #include <sys/sem.h>
  4. #include <sys/ipc.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. int main()
  8. {
  9.     key_t key;
  10.     /*信号量ID*/
  11.     int semid;
  12.     /*创建信号量*/
  13.     key=ftok(".",88);
  14.     if(key==-1)printf("ftok err:%m\n"),exit(-1);

  15.     //semid = semget(key,1,IPC_CREAT|IPC_EXCL|0666);
  16.     semid = semget(key,1,0);
  17.     if(semid==-1)printf("get err:%m\n"),exit(-1);
  18.     printf("semid=%d\n",semid);
  19.     /*初始化信号量semctl*/
  20.         /*定义一个联合*/
  21.     /*union semun{
  22.         int val;
  23.         struct semid_ds *buf;
  24.         unsigned short *array;
  25.         struct seminfo *_buf;
  26.     };*/
  27.         /*定义一个初始化的值*/
  28.     //int r;
  29.     //union semun v;
  30.     //v.val = 2;/*需要阻塞几次:*/
  31.     //r = semctl(semid,0,SETVAL,v);/*设置信号量*/
  32.     //if(r==-1)printf("初始失败\n"),exit(-1);
  33.     /*对信号量进行阻塞操作semop*/
  34.         /*定义操作*/
  35.     struct sembuf op[2];/*定义了两个操作*/
  36.     op[0].sem_num = 0;/*信号量的下标*/
  37.     op[0].sem_op = 1;/*阻塞操作就是减操作*/
  38.     while(1)
  39.     {
  40.         r=semop(semid,op,1);
  41.         sleep(1);
  42.     }
  43.     /*删除信号量*/
  44.     return 0;
  45. }


阅读(942) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~