sem_timedwait with EINTR-check 是否保证等待 >= 指定时间?

Is sem_timedwait with EINTR-check guaranteed to wait >= the specified time?

经常推荐的信号量定时等待方法是(为简洁起见进行了简化):

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 5;
ts.tv_nsec += 3;
while (sem_timedwait(&sem, &ts) == -1 && errno == EINTR)
    continue;

假设信号量没有被发送到(即预期超时),while-loop 保证ts中指定的时间退出(或稍后)? IE。是否保证 while 循环不会在 ts 中指定的时间 之前 退出?

我不太记得观察 sem_timedwait()ts - 中指定的时间 之前略微退出 但我不记得是否那是因为我没有使用 EINTR-check。我确实记得有一段时间我不太明白 EINTR-check 的用途,所以我单独使用了 sem_timedwait(),没有结合 while 循环和 EINTR -check_.

Assuming the semaphore is not posted-to (i.e. timeout is expected), is the while-loop guaranteed to exit at the time specified in ts (or slightly later)? I.e. is it guaranteed that the while-loop will not exit before the time specified in ts?

这取决于您所说的 "guaranteed" 是什么意思,但是 the specifications 对于 sem_timedwait 没有规定它会在指定时间到期之前超时。但是,由于其他原因,它可能会更快失败,所以从这个意义上说,不,不能保证示例 while 循环将 运行 指定的全部时间。

特别是,即使所有参数均有效且调用未被信号中断,sem_timedwait() 也被明确允许失败并显示 EDEADLK 以指示检测到死锁。