dup2真的能回归EINTR吗?

时间:2013-04-10 15:22:49

标签: linux posix freebsd language-lawyer file-descriptor

在规范和两个实现中:

  • 根据POSIX,dup2()可能会返回EINTR。
  • linux手册页将其列为允许。
  • FreeBSD手册页显示它没有返回。这是一个错误 - 因为它的紧密实现可以EINTR(至少对于TCP来说,如果没有别的话)。

实际上,Linux可以返回dup2()的EINTR吗?据推测,如果是这样,那将是因为close()决定等待并且信号到达(TCP逗留或狡猾的文件系统驱动程序在关闭时尝试同步)。

实际上,FreeBSD是否保证不会为dup2()返回EINTR?在这种情况下,它必须是它不会在旧的fd上等待任何未完成的操作并且只是取消链接f​​d。

POSIX dup2()在提及"关闭"时的含义是什么(不是斜体),而不是参考实际的close()函数 - 我们是否理解它只是在谈论"关闭"它以非正式的方式(取消链接文件描述符),或者是否试图说效果应该好像首先调用close()函数,然后原子地调用dup2()

  

如果 fildes2 已经是有效的打开文件描述符,则应首先关闭它,除非 fildes 等于 fildes2 ,在这种情况下< em> dup2()将在不关闭的情况下返回 fildes2

如果dup2() 必须关闭,等待,然后原子地复制,它将成为实施者的噩梦!它比close()惨败的EINTR更糟糕。 Cowardly POSIX甚至没有说过,如果在EINTR的情况下发生了复制......

1 个答案:

答案 0 :(得分:1)

以下是C / POSIX库文档中有关标准Linux实现的相关信息:

 If OLD and NEW are different numbers, and OLD is a valid
 descriptor number, then `dup2' is equivalent to:

      close (NEW);
      fcntl (OLD, F_DUPFD, NEW)

 However, `dup2' does this atomically; there is no instant in the
 middle of calling `dup2' at which NEW is closed and not yet a
 duplicate of OLD.

它列出了dupdup2作为EBADFEINVALEMFILE返回的可能错误值,而没有列出其他错误值。文档说明所有可以返回EINTR的函数都是这样列出的,这表明它们没有。请注意,这些是通过fcntl实现的,而不是对close的调用。