在我的用户空间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) );
}
非常直接。它已经工作了很长一段时间了。但是最近,在程序进行一些压力测试后,写入调用将因“系统调用中断”错误而失败。
奇怪的是,这些东西实际上通过管道没问题。当然,我仍然想要找到错误信息的底部并摆脱它。谢谢,
答案 0 :(得分:2)
符合 SVr4,4.3BSD,POSIX.1-2001。
在SVr4下,写入可能会中断并在任何时刻返回EINTR,而不是在写入任何数据之前。
我猜你很幸运,到目前为止没有发生。
如果您仅仅针对“中断的系统调用”进行Google搜索,则会发现this thread,它会告诉您使用siginterrupt()
自动重新启动write
来电。
答案 1 :(得分:0)
信号可以在I / O原语(如打开)时到达和处理 或读取正在等待I / O设备。如果信号处理程序返回, 系统面临的问题是:接下来会发生什么?
POSIX指定了一种方法:使原语立即失败。该 这种故障的错误代码是EINTR。这很灵活,但是 通常不方便。通常,POSIX应用程序使用信号 处理程序必须在每个库函数之后检查EINTR 返回它,以便再次尝试呼叫。程序员经常忘记 检查,这是一个常见的错误来源。
因此,您可以处理EINTR错误,顺便提一下,您可以使用sigaction建立一个信号处理程序,指定该处理程序的行为方式。使用SA_RESTART
标志,从该处理程序返回将恢复原语;否则,从该处理程序返回将导致EINTR。