msem_lock 子例程

用途

锁定信号量。

标准 C 库 (libc.a)

语法

#include <sys/mman.h>
int msem_lock ( Sem Condition)
msemaphore *Sem;
int Condition;

描述

msem_lock 子例程尝试锁定二进制信号量。

如果信号量当前未被锁定,那么它将被锁定,并且 msem_lock 子例程将成功完成。

如果信号量当前已锁定,并且 Condition 参数的值为 MSEM_IF_NOWAIT,那么 msem_lock 子例程将返回错误。 如果信号量当前已锁定,并且 Condition 参数的值为 0 ,那么在调用进程能够成功锁定信号量或发生错误情况之前, msem_lock 子例程不会返回。

通过共享公共 msemaphore 结构的多个进程对 msem_lockmsem_unlock 子例程的所有调用都像对调用进行序列化一样工作。

如果 msemaphore 结构包含对 msem_init 子例程的调用未产生的任何值,后跟对 msem_lockmsem_unlock 子例程的调用序列 (可能为空) , 结果未定义。 msemaphore 结构的地址很重要。 如果 msemaphore 结构包含从位于不同地址的 msemaphore 结构复制的任何值,那么结果是未定义的。

参数

描述
Sem 指向指定要锁定的信号量的 msemaphore 结构。
Condition 确定 msem_lock 子例程是否等待当前锁定的信号量解锁。

返回值

成功时, msem_lock 子例程返回值 0。 否则,返回值为-1,并设置errno全局变量来指示错误。

错误代码

如果 msem_lock 子例程不成功,那么 errno 全局变量设置为下列其中一个值:

描述
再次 指示为 Condition 参数指定了值 MSEM_IF_NOWAIT ,并且信号已锁定。
EINVAL 指示 Sem 参数指向指定已除去的信号量的 msemaphore 结构,或者 Condition 参数无效。
EINTR 指示 msem_lock 子例程被捕获的信号中断。