代码之家  ›  专栏  ›  技术社区  ›  12431234123412341234123

如何克隆文件描述符?(不仅仅是复制它)

  •  0
  • 12431234123412341234123  · 技术社区  · 3 年前

    我想克隆一个文件描述符。所以改变它 fcntl() 不会更改原始文件描述符。

    在我的情况下,重新打开相同的路径不起作用,文件描述符可能指向管道或套接字。

    背景

    我想在不阻塞的情况下从继承的文件描述符中读取。但是当我启用flag时 O_NONBLOCK ,父文件描述符也是非阻塞的,如果父文件或其他任何东西使用相同的文件描述并将其设置为阻塞,则该文件描述的所有文件描述符在所有使用它的进程中都是阻塞的。A dup() 呼叫也没有帮助,呼叫 fcntl() 将更改两个文件描述符。父级在文件描述符为非阻塞时中断,子级在文件描述符为阻塞时中断。

    我不能用 recv() 因为它只适用于套接字,所以文件描述符可以是套接字,也可以是常规文件、管道或fifo。

    我可以在退出孩子之前尝试将文件更改回非阻塞,但当孩子以计划外的方式退出时,这可能不起作用。我无法更改家长。

    0 回复  |  直到 3 年前
        1
  •  1
  •   pilcrow    3 年前

    你所要求的是做不到的。文件位置和某些I/O模式(包括O_NONBLOCK)等都是的属性 open file description 在整数文件描述符下面。

    新获取文件或类文件对象的函数( 打开 , , 插座 等等)分配新的和不同的文件描述。然而,正如你所发现的, dup 朋友会给你不同的描述符,这些描述符指的是共享的底层描述。