哪个读(2)错误是不可恢复的?

时间:2016-05-19 01:14:39

标签: linux posix

man page for read(2)列出了调用read时可能发生的许多错误。其中一些是良性的,如EAGAIN。有些显然是不可恢复的,例如EBADFEFAULT。有些更模糊,例如EIOEINTR。但是,该手册页并未对哪些错误无法恢复以及哪些错误只是打嗝做出任何断言。是否可以将所有错误归类为致命或重要?

posix specification for read()读取与linux手册页非常相似。它还补充说:

  

没有提及在"不可恢复的错误"之后采取的行动。超出POSIX.1-2008本卷的范围,可以描述在硬件错误情况下会发生什么。

在讨论POSIX系统时,是否存在关于在常见错误情况下该怎么做的文献,尽管这些操作不是严格的范围内?编写可移植代码时是否还有其他注意事项?

1 个答案:

答案 0 :(得分:1)

这些依赖于上下文:

  • EAGAIN仅发生在非阻塞文件描述符上。除非你设置了非阻塞标志,否则你可以将它与其他标志一起视为致命,因为它不会发生。
  • EINTR仅在您的流程收到未忽略的信号时才会发生,并且该流程仍然存在。为此,您需要设置一个信号处理程序。除非你这样做,否则将其视为致命的。

你提到的其他人也是致命的:

  • EIO可能是硬件问题。
  • EBADF是您程序中的问题:您传递了无效的文件描述符。
  • EFAULT也是程序中的问题:您传递了无效的缓冲区地址。

简而言之:除非您执行异步I / O和信号处理等特殊操作,否则您可以将所有错误视为致命错误。