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