代码之家  ›  专栏  ›  技术社区  ›  Franck Freiburger

如何在sem-timedwait中管理EINTR errno

  •  0
  • Franck Freiburger  · 技术社区  · 14 年前

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

    (EINTR:调用被信号处理程序中断)

    而不是简单地:

    s = sem_timedwait(&sem, &ts);
    

    在巫婆的情况下我必须管理埃因特?

    1 回复  |  直到 14 年前
        1
  •  2
  •   mark4o    14 年前

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

    例如,如果希望能够中止 sem_timedwait() 通过向线程发送一个特定的信号,您就不想无条件地重新启动系统调用。相反,您可能希望标记操作已中止并清除。如果有多个信号处理程序,则信号处理程序可以设置一个标志,该标志可以在 EINTR

    只有当线程使用信号处理程序捕获任何信号,并且 sigaction() SA_RESTART

    推荐文章