c - 理解 sem_timedwait()
问题描述
我正在阅读手册sem_timedwait()
,但无法弄清楚示例。我目前的理解是:
- 如果
sem_timedwait()
超时,则返回 -1 并设置errno
为ETIMEDOUT
. 因此,我可以检查它是否超时而不是发出信号。 sem_timedwait()
如果它发出信号,将返回 0sem_post()
所以我理解 if 语句,但是我不理解 while 循环。所以它会在sem_timedwait()
返回错误(?)时循环,而当它被sem_post()
调用发出信号时?(我显然不明白 的定义"EINTR The call was interrupted by a signal handler"
)
来自男人的例子:
while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
continue; /* Restart if interrupted by handler */
/* Check what happened */
if (s == -1) {
if (errno == ETIMEDOUT)
printf("sem_timedwait() timed out\n");
else
perror("sem_timedwait");
} else
printf("sem_timedwait() succeeded\n");
我认为它的工作方式类似于:
s = sem_timedwait(&sem, &ts)
if (errno == ETIMEDOUT) {
// timed out after specified ts
}
else if (s == -1) {
// error occurred
}
else {
// interrupted by `sem_post()`, do something relying on shared resource
}
解决方案
while
循环:
while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
continue; /* Restart if interrupted by handler */
将循环直到sem_timedwait
调用成功(即sem_post()
发生)或发生错误以外的错误EINTR
。
错误会被EINTR
特殊处理,因为sem_timedwait
调用可以随时被信号中断。这不会被视为错误,而是被视为中断(就是这样),并且在这种情况下会重试调用。
推荐阅读
- python - 如何在不使用循环的情况下重写 NumPy 代码
- javascript - 当我让它出现或消失内容时,CSS切换切换动画不起作用
- java - 在 Java 中使用泛型来避免代码重复
- r - 从 R Markdown(当 longtable 不可用时)使表格跨越 pdf 的多个页面?
- python - 解释这个列表合并的 oneliner 列表是如何工作的?
- python - 如何过滤python中有字符串值的值?
- jquery - 如何使用 CSS 使页面标题居中?
- azerothcore - 我可以配置 AzerothCore 以便只有两个人可以从头到尾(突袭)玩 WLK 吗?
- apache-spark - 将字符串的一部分转换为数据帧的不同列
- c# - 接收广播