写入管道时中断系统调用错误

时间:2011-05-06 09:56:14

标签: unix pipe signals

在我的用户空间Linux应用程序中,我有一个通过管道传递给主进程的线程。以下是代码

static void _notify_main(int cond)
{
    int r;
    int tmp = cond;

    r = write( _nfy_fd, &tmp, sizeof(tmp) );
    ERROR( "write failed: %d. %s\n",  r, strerror(r) );
}

非常直接。它已经工作了很长一段时间了。但是最近,在程序进行一些压力测试后,写入调用将因“系统调用中断”错误而失败。

奇怪的是,这些东西实际上通过管道没问题。当然,我仍然想要找到错误信息的底部并摆脱它。

谢谢,

2 个答案:

答案 0 :(得分:2)

write(2) man page提及:

  

符合   SVr4,4.3BSD,POSIX.1-2001。

     

在SVr4下,写入可能会中断并在任何时刻返回EINTR,而不是在写入任何数据之前。

我猜你很幸运,到目前为止没有发生。

如果您仅仅针对“中断的系统调用”进行Google搜索,则会发现this thread,它会告诉您使用siginterrupt()自动重新启动write来电。

答案 1 :(得分:0)

来自http://www.gnu.org/

  

信号可以在I / O原语(如打开)时到达和处理   或读取正在等待I / O设备。如果信号处理程序返回,   系统面临的问题是:接下来会发生什么?

     

POSIX指定了一种方法:使原语立即失败。该   这种故障的错误代码是EINTR。这很灵活,但是   通常不方便。通常,POSIX应用程序使用信号   处理程序必须在每个库函数之后检查EINTR   返回它,以便再次尝试呼叫。程序员经常忘记   检查,这是一个常见的错误来源。

因此,您可以处理EINTR错误,顺便提一下,您可以使用sigaction建立一个信号处理程序,指定该处理程序的行为方式。使用SA_RESTART标志,从该处理程序返回将恢复原语;否则,从该处理程序返回将导致EINTR。

请参阅interrupted primitives