首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在读取/proc文件时处理EINTR吗?

问我应该在读取/proc文件时处理EINTR吗?
EN

Stack Overflow用户
提问于 2020-08-02 00:17:14
回答 1查看 262关注 0票数 1

在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的错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-02 00:42:39

read的文档没有区分底层文件系统,它无论如何都可以返回-1。因此,你应该处理它。

你如何处理它取决于你自己。例如,您可以选择退出程序,将故障通知用户。或者,您可以重新尝试read,假设这是一个临时问题,如下所示:

代码语言:javascript
复制
int interrupted = 1, limit = 5, result;
while (interrupted) {
    result = read(...);
    interrupted = (result == -1) && (errno == EINTR) && (limit-- > 0);
}

这将尝试在放弃之前多次读取文件(假设故障原因是EINTR -任何其他原因都会立即退出循环)。当循环退出时,要么有一个成功的读取(result > 0),要么一个不成功的errno设置为原因)。

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

代码语言:javascript
复制
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调用的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63211220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档