Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
在/proc中读取文件时是否应处理EINTR_C_Linux - Fatal编程技术网

在/proc中读取文件时是否应处理EINTR

在/proc中读取文件时是否应处理EINTR,c,linux,C,Linux,在Linux中read()调用可以返回-1并将EINTR放入errno。我理解为什么它会发生在管道或插座上。 但是proc文件系统中的文件呢?我们真的能在阅读它们的同时获得EINTR 我试着在开源中搜索,发现它在某个地方得到了处理: 但不是在某个地方: 它是否取决于/proc中的特定文件?如果是,我在哪里可以阅读?或者这种处理总是多余的,或者跳过处理EINTR可能是一个bug?读取的文档不区分底层文件系统,它可以返回-1。因此,你应该处理它 如何处理这件事取决于你自己。例如,您可以选择退出

在Linux中
read()
调用可以返回
-1
并将
EINTR
放入
errno
。我理解为什么它会发生在管道或插座上。 但是proc文件系统中的文件呢?我们真的能在阅读它们的同时获得
EINTR

我试着在开源中搜索,发现它在某个地方得到了处理:

但不是在某个地方:


它是否取决于/proc中的特定文件?如果是,我在哪里可以阅读?或者这种处理总是多余的,或者跳过处理
EINTR
可能是一个bug?

读取
的文档不区分底层文件系统,它可以返回
-1
。因此,你应该处理它

如何处理这件事取决于你自己。例如,您可以选择退出程序,通知用户失败。或者,您可以重试
读取
,假设这是一个临时问题,例如:

int interrupted = 1, limit = 5, result;
while (interrupted) {
    result = read(...);
    interrupted = (result == -1) && (errno == EINTR) && (limit-- > 0);
}
这将在放弃之前尝试多次读取该文件(假设故障原因是
EINTR
-任何其他原因都会立即退出循环)。当循环退出时,要么读取成功(
result>0
),要么读取不成功(原因设置为
errno

您还可以将该代码重构为一个函数,为您完成繁重的工作,例如使用我之前用于此目的的函数:

ssize_t interruptibleRead(
    int     fd,             // Standard read parameters.
    void    *buf,
    size_t  count,
    size_t  limit,          // Maximum attempts.
    size_t  msDelay,        // Initial delay after interrupted read.
    size_t  msDelayDelta    // Extra delay added for each interrupted read.
);

这将避免在代码中添加复杂的循环,只需将
read
调用替换为
interruptableread

,因为任何系统调用至少在理论上都可以返回EINTR;在实践中,对于任何给定的呼叫,你是否可以忽略可能的结果而不受惩罚是不容易知道的;今天可能是这样,但在下一个版本的操作系统中不是这样,反之亦然。相关:您的程序是否注册任何自定义信号处理程序?如果没有,那么除了一些像epoll和io__________________________________________