如何解决如何克隆文件描述符? 不仅仅是复制它
我想克隆一个文件描述符。因此,使用 fcntl()
更改它不会更改原始文件描述符。
在我的情况下,重新打开相同的路径不起作用,文件描述符可能指向管道或套接字。
背景:
我想在不阻塞的情况下从继承的文件描述符中读取。但是当我启用标志 O_NONBLOCK
时,父文件描述符也是非阻塞的,如果父文件描述符或其他任何文件使用相同的文件描述并将其设置为阻塞,则该文件描述的所有文件描述符都是阻塞的,在所有使用它的过程中。 dup()
调用也无济于事,调用 fcntl()
将更改两个文件描述符。当文件描述符为非阻塞时父进程中断,当文件描述符阻塞时子进程中断。
我不能使用 recv()
因为它只适用于套接字,文件描述符可以是套接字但也可以是常规文件、管道或先进先出。
我可以在退出孩子之前尝试将文件改回非阻塞状态,但是当孩子以计划外的方式退出时,这可能不起作用。我无法更改父级。
解决方法
你所要求的无法完成。诸如文件位置和某些 I/O 模式(包括 O_NONBLOCK)之类的东西是 open file description “低于”整数文件描述符的属性。
新获取文件或类文件对象的函数(open、pipe、socket 等)分配一个新的和不同的文件描述。然而,正如您所发现的,dup 和 fork 和朋友会为您提供不同的描述符,这些描述符引用共享的底层描述。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。