我想克隆一个文件描述符。因此,使用fcntl()更改它不会更改原始文件描述符。
在我的例子中,重新打开相同的路径不起作用,文件描述符可能指向管道或套接字。
背景:
我想在不阻塞的情况下从继承的文件描述符中读取。但是当我启用标志O_NONBLOCK时,父文件描述符也是非阻塞的,并且如果父文件描述符或其他任何东西使用相同的文件描述并将其设置为阻塞,则在使用它的所有进程中,该文件描述的所有文件描述符都是阻塞的。dup()调用也没有帮助,对fcntl()的调用将更改这两个文件描述符。当文件描述符为非阻塞时,父进程中断,而当文件描述符为阻塞时,子进程中断。
我不能使用recv(),因为它只在套接字上工作,文件描述符可以是套接字,也可以是常规文件、管道或先进先出。
在退出子进程之前,我可以尝试将文件改回非阻塞状态,但是当子进程以意外方式退出时,这可能不起作用。我不能改变父母。
发布于 2021-07-17 20:33:54
你所要求的是做不到的。像文件位置和某些I/O模式,包括O_NONBLOCK,都是整数文件描述符下open file description的属性。
新获取文件或类文件对象的函数(打开、管道、套接字等)分配新的和不同的文件描述。但是,正如您已经发现的,dup和fork以及friends为您提供了不同的描述符,这些描述符引用了共享的底层描述。
https://stackoverflow.com/questions/68416612
复制相似问题