linux - dup2 真的可以返回 EINTR 吗?

标签 linux posix freebsd language-lawyer file-descriptor

在规范和两个实现中:

  • 根据 POSIX,dup2()可能返回 EINTR。
  • linux 手册页将其列为允许的。
  • FreeBSD 手册页表明它从未返回。这是一个错误吗 - 因为它的紧密实现可以 EINTR(至少对于 TCP 徘徊,如果没有别的)。

  • 实际上,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 可能返回的错误值。和 dup2EBADF , EINVAL , 和 EMFILE ,而没有其他人。该文档指出,所有可以返回 EINTR 的函数都按此类列出,这表明这些函数没有。请注意,这些是通过 fcntl 实现的。 ,而不是调用 close .

    关于linux - dup2 真的可以返回 EINTR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930013/

    相关文章:

    dprintf 的跨平台兼容性

    c++ - Freebsd 的 Makemkv

    email - 127.0.0.1拒绝sendmail连接

    linux - 页表项中的可执行位在哪里?

    c - 如何使用 P 进程确定一个值是否存在于数组中

    linux - 什么是./在终端上执行期间

    mysql - MySQL 5.6 升级到 5.7 后数据无法再访问

    .net - 构建 .net 核心 docker 镜像失败

    regex - 提取单词并将其放在行首

    networking - 断开并重新连接已连接的数据报套接字