Chinaunix首页 | 论坛 | 博客
  • 博客访问: 849982
  • 博文数量: 90
  • 博客积分: 766
  • 博客等级: 军士长
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-18 08:42
个人简介

linux

文章分类

全部博文(90)

文章存档

2021年(2)

2020年(2)

2017年(1)

2015年(11)

2014年(1)

2013年(53)

2012年(16)

2011年(4)

分类: LINUX

2012-10-18 14:29:01

       Linux信号量(semaphore)是一种互斥机制。即对某个互斥资源的访问会收到信号量的保护,在访问之前需要获得信号量。
在操作完共享资源后,需释放信号量,以便另外的进程来获得资源。获得和释放应该成对出现。
       获得信号量集,需要注意的是,获得的是一个集合,而不是一个单一的信号量。
       #include
       #include
       #include
1:       int semget(key_t key,int nsems,int semflg);
          key:系统根据这个值来获取信号量集。
          nsems:此信号集包括几个信号量。
          semflg:创建此信号量的属性。 (IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)
          成功则返回该信号量集的ID。
注:
既指定IPC_CREAT又指定IPC_EXCL时,如果系统中该信号量集已经存在,则马上返回。
如果需要获得存在的信号量,则将此参数置0.
2:      int semctl(int   semid,int senum,int cmd....)
          semid:信号量ID。
          senum:对信号量集中的第几个信号量进行控制。(从0开始)
          cmd:需要进行的操作。(SETVAL是其中的一个)。
          根据cmd的不同可能存在第四个参数,cmd=SETVAL时,表示同时信号量可以被获得几次,如第四个参数
num=1表示只能被获得一次,既被信号量保护的资源只能同时被一个程序使用。
          该系统调用,是在对信号量初始化时用的。
-3:   “3”前面加了"-"表示当需要使用互斥资源时应该做这步。
           int semop(int semid,struct sembuf *sem,int num_elements);
           struct sembuf {
                      unsigned short sem_num;    //该信号量集中的第几个信号量。
                      int sem_op;//需要获得还是释放信号量
                      int sem_flg;//相关动作
          };
          num_elements:需要对该信号量集中的多少个信号量进行处理。
          获得信号量时,将sembuf结构提初始化为:
                     sem_num = 0; //该信号量集中的首个信号量
                     sem_op = -1; //获得信号量
                     sem_flag = IPC_NOWAIT;   //如果不能获得信号量,马上返回。
          semop(semid,_sem,1);
          同理释放信号量时,将sem_op设为1.
以上是对信号量的简单处理,望深入学习。
      
阅读(14766) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~