Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 写入管道时中断的系统调用错误_Unix_Pipe_Signals - Fatal编程技术网

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

Unix 写入管道时中断的系统调用错误,unix,pipe,signals,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) ); } 非常直截了当。很长一段时间以来,它一直运转良好。但是最近,在

在我的用户空间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) );
}
非常直截了当。很长一段时间以来,它一直运转良好。但是最近,在程序进行一些压力测试之后,写调用将失败,并出现“中断系统调用”错误

奇怪的是,这些东西实际上通过了管道,没问题。当然,我仍然希望找到错误消息的底部并将其清除

谢谢,

提到:

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

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

我想你只是幸运,到目前为止还没有发生

如果您只搜索“中断的系统调用”,您将发现哪个命令告诉您使用
sigcrupt()
自动重新启动
写入
调用。

信号可以在I/O原语(如open)打开时到达并处理 或者read正在等待I/O设备。如果信号处理程序返回, 系统面临着这样一个问题:接下来会发生什么

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

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


谢谢。正如我在原来的问题中补充的那样,它发生在每个write()上,这非常奇怪。@lang2:我认为在压力测试中,写操作非常大。也许您应该尝试将数据分块到大小合理的缓冲区中,然后写入这些缓冲区。