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 () 函数是 SemaphoresTimeouts 选项的一部分,无需在所有实现上提供。

返回值

如果调用进程成功对 sem指定的信号量执行信号量锁定操作,那么 sem_timedwait () 函数将返回 0。 如果调用不成功,则 semaphore 的状态保持不变,函数返回值为-1,并设置errno表示错误。

错误代码

如果发生以下情况, sem_timedwait () 函数将失败:

描述
[Efault] abs_timeout 引用了无效的内存。
[缺省值] sem 自变量未引用有效的信号量。
[缺省值] 进程或线程将被阻塞,并且 abs_timeout 参数指定了小于 0 或大于或等于 1000 万的纳秒字段值。
[ETIMEDOUT] 在指定的超时到期之前,无法锁定信号量。

在下列情况下, sem_timedwait () 函数可能会失败:

描述
[EDEADLK] 检测到死锁情况。
[EINTR] 信号中断了此功能。