【发布时间】: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