在规范和两个实现中:
dup2()
可能会返回EINTR。实际上,Linux可以返回dup2()
的EINTR吗?据推测,如果是这样,那将是因为close()
决定等待并且信号到达(TCP逗留或狡猾的文件系统驱动程序在关闭时尝试同步)。
实际上,FreeBSD是否保证不会为dup2()
返回EINTR?在这种情况下,它必须是它不会在旧的fd上等待任何未完成的操作并且只是取消链接fd。
POSIX dup2()
在提及"关闭"时的含义是什么(不是斜体),而不是参考实际的close()
函数 - 我们是否理解它只是在谈论"关闭"它以非正式的方式(取消链接文件描述符),或者是否试图说效果应该好像首先调用close()
函数,然后原子地调用dup2()
。
如果 fildes2 已经是有效的打开文件描述符,则应首先关闭它,除非 fildes 等于 fildes2 ,在这种情况下< em> dup2()将在不关闭的情况下返回 fildes2 。
如果dup2()
必须关闭,等待,然后原子地复制,它将成为实施者的噩梦!它比close()
惨败的EINTR更糟糕。 Cowardly POSIX甚至没有说过,如果在EINTR的情况下发生了复制......
答案 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.
它列出了dup
和dup2
作为EBADF
,EINVAL
和EMFILE
返回的可能错误值,而没有列出其他错误值。文档说明所有可以返回EINTR的函数都是这样列出的,这表明它们没有。请注意,这些是通过fcntl
实现的,而不是对close
的调用。