【问题标题】:How to clone a file descriptor? (not just duplicate it)如何克隆文件描述符? (不只是复制它)
【发布时间】:2021-07-17 20:33:54
【问题描述】:

我想克隆一个文件描述符。这样用fcntl() 更改它不会更改原始文件描述符。

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

​​背景:

我想从继承的文件描述符中读取而不阻塞。但是当我启用标志O_NONBLOCK 时,父文件描述符也是非阻塞的,如果父文件或其他任何东西使用相同的文件描述并将其设置为阻塞,则该文件描述的所有文件描述符都是阻塞的使用它的进程。 dup() 调用也无济于事,调用fcntl() 将更改两个文件描述符。文件描述符非阻塞时父节点中断,文件描述符阻塞时子节点中断。

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

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

【问题讨论】:

  • 你使用的是什么操作系统?
  • 你不能在孩子中使用poll()等而不是依赖非阻塞文件描述符吗?
  • 无法克隆打开的文件描述。您只能通过调用open 和朋友来创建新的打开文件描述。我认为这是有意设计的,而不是偶然的。
  • @Shawn 我将不得不在多个程序中为此更改大量代码,我宁愿不这样做。我使用pselect() 等待下一个事件,然后检查每个事件源。我知道这个 O(n**2),但到目前为止效果很好。
  • @n.1.8e9-where's-my-sharem。我知道这对于文件偏移量、波特率是有意义的……但是为什么要阻塞与非阻塞呢?您甚至可以使用recv() 在每个系统调用级别上更改它,但遗憾的是这不适用于管道和常规文件。一个适用于所有文件描述符类型的recv()-调用,类似于读取,也会很棒。

标签: c posix nonblocking file-descriptor


【解决方案1】:

您所要求的无法完成。文件位置和某些 I/O 模式(包括 O_NONBLOCK)是整数文件描述符“下方”的open file description 的属性。

新获取文件或类文件对象的函数(openpipesocket 等)分配一个新的和不同的文件描述。然而,正如您所发现的,dupfork 以及朋友们为您提供了不同的描述符,它们引用了共享的底层描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多