sem_trywait 和 sem_wait 子例程
用途
锁定信号量。
库
标准 C 库 (libc.a)
语法
#include <semaphore.h>
int sem_trywait (sem)
sem_t *sem;
int sem_wait (sem)
sem_t *sem;描述
sem_trywait 子例程仅在信号量当前未锁定时 (即,如果信号量值当前为正数时) 锁定 sem 参数引用的信号量。 否则,它不会锁定信号量。
sem_wait 子例程通过对该信号量执行信号量锁定操作来锁定由 sem 参数引用的信号量。 如果信号量值当前为零,那么调用线程不会从调用返回到 sem_wait 子例程,直到它锁定信号量或调用被信号中断为止。
成功返回时,信号量的状态将被锁定,并且将保持锁定状态,直到执行 sem_post 子例程并成功返回为止。
传递信号可中断 sem_wait 子例程。
参数
| 项 | 描述 |
|---|---|
| sem | 指定要锁定的信号量。 |
返回值
如果调用进程成功执行信号锁定操作,那么 sem_trywait 和 sem_wait 子例程返回零。 如果调用不成功,则半寄存器的状态保持不变,子程序返回-1并设置errno以指示错误。
错误代码
sem_trywait 和 sem_wait 子例程在下列情况下失败:
| 项 | 描述 |
|---|---|
| EACCES | 许可权被拒绝访问未命名的信号量。 |
| 再次 | 信号量已被锁定,因此它不能被 sem_trywait 子例程立即锁定。 |
| Efault | 用户地址无效。 |
| EIDRM | 在所需操作期间除去了信号量。 |
| EINTR | 信号中断了子例程。 |
| EINVAL | sem 参数未引用有效的信号量。 |
| ENOMEM | 内存不足,无法执行必需的操作。 |
| ENOTSUP | 已执行 checkpoint-restart'ed的进程不支持此功能。 |