在Linux中,read()调用可以返回-1并将EINTR放入errno。我明白为什么会发生在管道或插座上。但是proc文件系统中的文件呢?我们真的能在阅读时得到EINTR吗?
我试图在开放源码中搜索,发现在某个地方可以处理它:
https://github.com/Distrotech/libaudit/blob/distrotech-libaudit/lib/libaudit.c#L700 https://github.com/mmalecki/procps/blob/master/proc/readproc.c#L517
但在某些地方没有:
https://github.com/slicer69/sysvinit/blob/master/sysvinit/trunk/src/bootlogd.c#L303
这取决于/proc中的特定文件吗?如果有,我在哪里可以阅读到?或者这种处理总是多余的,或者可能是跳过处理EINTR的错误?
发布于 2020-08-02 00:42:39
read的文档没有区分底层文件系统,它无论如何都可以返回-1。因此,你应该处理它。
你如何处理它取决于你自己。例如,您可以选择退出程序,将故障通知用户。或者,您可以重新尝试read,假设这是一个临时问题,如下所示:
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.
);这将避免您的代码必须使用复杂的循环,这就变成了用interruptibleRead替换interruptibleRead调用的问题。
https://stackoverflow.com/questions/63211220
复制相似问题