在规范和两个实现中:
dup2()
可能返回 EINTR。 实际上,Linux 能否为
dup2()
返回 EINTR? ?如果是这样,大概是因为close()
决定等待并且信号到达(TCP 逗留或在关闭时尝试同步的狡猾的文件系统驱动程序)。实际上,FreeBSD 是否保证不为
dup2()
返回 EINTR? ?在这种情况下,它一定不会费心等待旧 fd 上的任何未完成的操作,而是简单地取消链接 fd。POSIX
dup2()
是什么意思表示当它指的是“关闭”(不是斜体),而不是指实际的 close()
功能 - 我们是否理解它只是在以非正式的方式“关闭”它(取消链接文件描述符),或者它是否试图说效果应该就像 close()
首先调用函数,然后调用 dup2()
被原子地调用。If fildes2 is already a valid open file descriptor, it shall be closed first, unless fildes is equal to fildes2 in which case dup2() shall return fildes2 without closing it.
如果
dup2()
确实必须关闭,等待,然后自动复制,这对实现者来说将是一场噩梦!它比带有 close()
的 EINTR 差得多。惨败。懦弱的 POSIX 甚至没有说在 EINTR 的情况下是否发生了重复......
最佳答案
以下是 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.
它列出了
dup
可能返回的错误值。和 dup2
如EBADF
, EINVAL
, 和 EMFILE
,而没有其他人。该文档指出,所有可以返回 EINTR 的函数都按此类列出,这表明这些函数没有。请注意,这些是通过 fcntl
实现的。 ,而不是调用 close
.
关于linux - dup2 真的可以返回 EINTR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930013/