10.3.2 创建或打开信号量

10.3.2 创建或打开信号量

创建或打开信号量的函数为semget,其接口定义如下:

int semget(key_t key, int nsems, int semflg);

这个接口比较简单,第二个参数nsems表示信号量集中信号量的个数。

换句话说,就是要控制几种资源。大部分情况下只控制一种。如果并非创建信号量,仅仅是访问已经存在的信号量集,可以将nsems指定为0。

semflg支持多种标志位。

目前支持IPC_CREATIPC_EXCL标志位,其含义不再赘述。

在创建信号量时,需要考虑的问题是系统限制。

系统的限制可以分成三个层面。

  • 系统容许的信号量集的上限:SEMMNI

  • 单个信号量集中信号量的上限:SEMMSL

  • 系统容许的信号量的上限:SEMMNS

首先介绍下对于每种限制,系统提供的硬上限,如表10-9所示。

表10-9 信号量的系统硬上限

其中SEMMSL的硬上限是65536,原因是semop函数中定义了sembuf结构体来操作信号量集中的信号量,代码如下所示:

struct sembuf{

        unsigned short sem_num;

}

sembuf结构体中的成员变量sem_num用来指定修改集合中的哪个信号量。其数据类型是无符号短整型(unsigned short)。我们固然可以一意孤行地将SEMMSL的值设置为大于65536的数值,但是后续将无法通过semop来操作它,因此它也就失去了存在的意义。因此集合中信号量个数的硬上限值为65536。

在SystemV信号量的接口设计中,存在一个致命的缺陷,即创建信号量集和初始化集合中的信号量是两个独立的操作,而非一个原子操作,标准并未要求创建信号量集时,将信号量的值初始化为0。

当然,在Linux系统上,semget函数返回的信号量实际上会被初始化为0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值