如何在sem_timedwait中管理EINTR errno

时间:2010-10-21 13:43:42

标签: pthreads posix semaphore

您能帮我理解为什么建议使用:

while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
    continue; // Restart when interrupted by handler

(EINTR:呼叫被信号处理程序中断)

而不仅仅是:

s = sem_timedwait(&sem, &ts);

在女巫的情况下,我必须管理EINTR?

1 个答案:

答案 0 :(得分:2)

如果在执行系统调用期间捕获到信号,则循环将导致系统调用重新启动,因此除非系统调用成功或失败,否则它将不会继续执行下一个语句(带有其他错误) )。否则,当系统调用被信号处理程序中断时,线程将继续执行下一个语句。

例如,如果您希望能够通过向线程发送特定信号来中止此sem_timedwait(),那么您将不希望无条件地重新启动系统调用。相反,您可能希望标记操作已中止并清理。如果您有多个信号处理程序,信号处理程序可以设置一个标志,可以在遇到EINTR时检查该标志,以确定是否重新启动系统调用。

这仅在线程使用信号处理程序捕获任何信号时才有意义,并且sigaction() SA_RESTART标志未用于自动重启任何中断的系统调用。但是,如果您没有使用任何信号处理程序并且不打算让您的代码受到信号处理程序的影响,那么使用循环仍然是一个好习惯,这样即使您的代码稍后您的代码仍然可以继续工作与其他使用信号处理程序的代码在同一程序中使用。