4

我正在用 C 编写一个 Web 服务器,我经常使用系统调用,错误返回 -1 并将“errno”变量设置为适当的值。一些系统调用可以返回 EINTR 和/或 EAGAIN。我有两个包装器 HANDLE_EINTR、HANDLE_EAGAIN 使用这两个错误值并重试系统调用。

手册页通常参考系统调用是否返回 EINTR 和/或 EAGAIN,但对于某些系统调用,它确实没有。此外,一些系统调用可能不直接返回 EINTR / EAGAIN,而是通过可能在其中使用的其他系统调用的失败返回。

我想问我是否可以使用 HANDLE_EINTR 和/或 HANDLE_EAGAIN 而不管 API 声明了什么(这并不总是完整的)。

另外,我从 Google 的人那里知道,将 HANDLE_EINTR 与“关闭”系统调用一起使用(尽管 API 提到使用它)不是一个好主意,所以我不使用它。是否有任何其他具有此行为的系统调用?

谢谢你。

4

1 回答 1

0

EINTR和的语义EAGAIN定义明确。如果一个特定的系统调用没有被记录为可能返回一个特定errno的,那么拥有一个处理程序并没有什么坏处。

大型应用程序实现单个错误处理程序是很常见的,该处理程序对广泛的errnos 采取适当的操作,并使用相同的错误处理程序来适当地处理来自许多不同系统调用的错误条件,即使可能没有记录特定的系统调用可能会返回一个特定的errno.

于 2014-09-07T14:29:14.507 回答