gpt4 book ai didi

c - 理解 sem_timedwait()

转载 作者:行者123 更新时间:2023-11-30 14:46:24 25 4
gpt4 key购买 nike

我正在阅读有关sem_timedwait()的手册,但无法弄清楚该示例。我目前的理解是:

  • 如果 sem_timedwait() 超时,则返回 -1 并将 errno 设置为 ETIMEDOUT。因此我可以检查它是否超时而不是收到信号。
  • sem_timedwait() 如果由 sem_post() 发出信号,将返回 0

所以我理解 if 语句,但是我不理解 while 循环。因此,当 sem_timedwait() 返回错误(?)并且由 sem_post() 调用发出信号时,它会循环? (我显然不明白“EINTR调用被信号处理程序中断”的定义)

来自 man 的示例:

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通话可以随时通过信号中断。这不会被视为错误,而是被视为中断(这就是它的本质),在这种情况下,调用只是重试。

关于c - 理解 sem_timedwait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52331735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com