阻止功能和EINTR

时间:2012-10-29 19:47:04

标签: signals blocking eintr

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

但是,某些阻塞函数(如pthread_mutex_lock和pthread_cond_wait)没有EINTR错误。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

通常,只有系统调用(低级OS调用)才会返回EINTR。更高级别的标准库调用不会。例如,readwrite可能会返回EINTR,但printfgets则不会。

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