gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:22:01 24 4
gpt4 key购买 nike

在规范和两个实现中:

  • 根据 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com