问题描述
我想克隆一个文件描述符。因此,使用 fcntl()
更改它不会更改原始文件描述符。
在我的情况下,重新打开相同的路径不起作用,文件描述符可能指向管道或套接字。
背景:
我想在不阻塞的情况下从继承的文件描述符中读取。但是当我启用标志 O_NONBLOCK
时,父文件描述符也是非阻塞的,如果父文件描述符或其他任何文件使用相同的文件描述并将其设置为阻塞,则该文件描述的所有文件描述符都是阻塞的,在所有使用它的过程中。 dup()
调用也无济于事,调用 fcntl()
将更改两个文件描述符。当文件描述符为非阻塞时父进程中断,当文件描述符阻塞时子进程中断。
我不能使用 recv()
因为它只适用于套接字,文件描述符可以是套接字但也可以是常规文件、管道或先进先出。
我可以在退出孩子之前尝试将文件改回非阻塞状态,但是当孩子以计划外的方式退出时,这可能不起作用。我无法更改父级。
解决方法
你所要求的无法完成。诸如文件位置和某些 I/O 模式(包括 O_NONBLOCK)之类的东西是 open file description “低于”整数文件描述符的属性。
新获取文件或类文件对象的函数(open、pipe、socket 等)分配一个新的和不同的文件描述。然而,正如您所发现的,dup 和 fork 和朋友会为您提供不同的描述符,这些描述符引用共享的底层描述。