sem_timedwait 子例程
用途
锁定信号量 (ADVANCED REALTIME)。
语法
#include <semaphore.h>
#include <time.h>
int sem_timedwait(sem_t *restrict sem,
const struct timespec *restrict abs_timeout);
描述
sem_timedwait () 函数锁定 sem 引用的信号量,如 sem_wait () 函数中所示。 但是,如果无法在不等待另一进程或线程通过执行 sem_post () 函数来解锁信号量的情况下锁定信号量,那么此等待将在指定超时到期时终止。
当 abs_timeout 指定的绝对时间经过时 (由超时所基于的时钟 (即,当该时钟的值等于或超过了 abs_timeout)) ,或者在调用时已经过 abs_timeout 指定的绝对时间时,超时将到期。
如果支持 计时器 选项,那么超时基于 CLOCK_REALTIME 时钟。 如果不支持 Timers 选项,那么超时将基于 time () 函数返回的系统时钟。 超时的分辨率与它所基于的时钟的分辨率相匹配。 蒂梅斯佩克 数据类型在 <time.h> 头中定义为结构。
如果可以立即锁定信号量,那么该函数永不会因超时而失败。 如果可以立即锁定信号量,那么不需要检查 abs_timeout 参数的有效性。
应用程序使用情况
sem_timedwait () 函数是 Semaphores 和 Timeouts 选项的一部分,无需在所有实现上提供。
返回值
如果调用进程成功对 sem指定的信号量执行信号量锁定操作,那么 sem_timedwait () 函数将返回 0。 如果调用不成功,则 semaphore 的状态保持不变,函数返回值为-1,并设置errno表示错误。
错误代码
如果发生以下情况, sem_timedwait () 函数将失败:
| 项 | 描述 |
|---|---|
| [Efault] | abs_timeout 引用了无效的内存。 |
| [缺省值] | sem 自变量未引用有效的信号量。 |
| [缺省值] | 进程或线程将被阻塞,并且 abs_timeout 参数指定了小于 0 或大于或等于 1000 万的纳秒字段值。 |
| [ETIMEDOUT] | 在指定的超时到期之前,无法锁定信号量。 |
在下列情况下, sem_timedwait () 函数可能会失败:
| 项 | 描述 |
|---|---|
| [EDEADLK] | 检测到死锁情况。 |
| [EINTR] | 信号中断了此功能。 |