许多POSIX阻塞函数在信号的情况下返回EINTR。想法是信号处理程序首先设置一个标志(在SIGINT的情况下说'stop'标志),然后阻塞功能解锁返回EINTR并且应用程序看到该标志并执行有序关闭(或其他)。
但是,某些阻塞函数(如pthread_mutex_lock和pthread_cond_wait)没有EINTR错误。
背后有什么想法?使用这些函数的应用程序如何处理信号(特别是Ctrl + C)?
答案 0 :(得分:1)
没有答案。我的假设是pthread_cond_wait()和SIGINT不能组合起来执行干净关闭。使用sem_wait()或类似代替pthread_cond_wait()。
答案 1 :(得分:0)
通常,只有系统调用(低级OS调用)才会返回EINTR。更高级别的标准库调用不会。例如,read
和write
可能会返回EINTR,但printf
和gets
则不会。
通常,接收EINTR
时正确的做法是重做调用 - 这就是为什么信号处理程序上存在SA_RESTART标志的原因。如果要处理Ctrl-C,则需要不要忽略该信号。退出的默认操作可能是您想要的,或者您可以编写自己的信号处理程序来执行其他操作。