11.3.1 创建、打开、关闭和删除有名信号量

在Unix/Linux系统中,有名信号量的创建和打开通过`sem_open`函数实现,该函数可以设置初始值并处理权限。信号量的副本不应被用于操作,只能使用`sem_open`返回的指针。`sem_close`用于关闭与信号量的关联,而`sem_unlink`用于删除信号量,但实际删除会在所有相关进程关闭后进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11.3.1 创建、打开、关闭和删除有名信号量

创建或打开有名信号量,需要调用sem_open函数,其接口定义如下:

sem_t *sem_open(const char *name, int oflag);

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

第二个参数oflag标志位支持的标志包括O_CREAT和O_EXCL标志位。

如果带了O_CREAT标志位,则表示要创建信号量。

mode表示创建的新信号量的访问权限,标志位和open函数一样,mode参数的值也会根据进程的umask来取掩码。

value是新建信号量的初始值。

创建和赋初值都是由一个接口来完成的,这样就不会出现SystemV信号量可能出现的初始化竞争的问题了。

value的值最小值0和最大值SEM_VALUE_MAX之间

SUSv3要求最大值至少等于32767,对于Linux而言,这个限制为INT_MAX(在Linux/x86平台上,该值是2147483647)。

当sem_open函数失败时,返回SEM_FAILED,并且设置errno。

注意,不要尝试创建sem_t结构体的副本,下面这段代码的做法是错误的:

sem_t *sem_p,sem_dup; 
sem_p = sem_open(… );
sem_dup = *sem_p;
/*非法操作 */
sem_wait(&sem_dup);

上面定义了sem_p的副本sem_dup,但在副本上执行sem的相关操作,行为是不可预知的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值