4

许多 POSIX 阻塞函数在出现信号时返回 EINTR。这个想法是信号处理程序首先设置一个标志(在 SIGINT 的情况下说“停止”标志),然后阻塞函数解除阻塞返回 EINTR 并且应用程序看到该标志并执行有序关闭(或其他)。

但是,对于一些阻塞函数,例如 pthread_mutex_lock 和 pthread_cond_wait,没有 EINTR 错误。

这背后的想法是什么?使用这些函数的应用程序应该如何处理信号(特别是 Ctrl+C)?

4

2 回答 2

1

没有答案。我的假设是 pthread_cond_wait() 和 SIGINT 不能结合起来执行干净的关闭。使用 sem_wait() 或类似方法代替 pthread_cond_wait()。

于 2012-11-03T10:59:21.630 回答
0

通常,只有系统调用(低级操作系统调用)返回 EINTR。更高级别的标准库调用没有。例如,readandwrite可能会返回 EINTR,但printf不会gets

通常,接收 an 时正确的做法EINTR是重做调用——这就是信号处理程序上存在 SA_RESTART 标志的原因。如果你想处理 Ctrl-C,你只需要不要忽略这个信号。退出的默认操作可能是您想要的,或者您可以编写自己的信号处理程序来执行其他操作。

于 2012-10-29T21:27:14.207 回答