首页 > 解决方案 > 同一文件的 2 个文件描述符

问题描述

对于已打开的文件,我有一个 >0 的文件描述符。我想向该文件添加第二个文件描述符。我知道如果我再次使用第二个文件描述符打开文件,这是可能的,但问题是在我的代码中我不知道文件的名称。

所以我想知道我是否可以这样做:fd2 = fd1;

标签: cunixfile-descriptor

解决方案


您可以复制文件描述符,为同一个打开的文件描述返回一个新的、不同的句柄,使用任一dup

#include <unistd.h>
int fd2 = dup(fd1);

或与fcntl/F_DUPFD

#include <fcntl.h>
int fd2 = fcntl(fd1, F_DUFPD, 0); // consider F_DUPFD_CLOEXEC !

因为fd2fd1现在引用相同的打开文件描述,它们“共享”底层打开文件描述的某些属性:

  • 状态标志(非阻塞、仅附加等)
  • 访问模式(只读、读写、只写)
  • 文件位置(阅读/寻找一个将反映在另一个)
  • 记录锁(与 POSIXstruct flock锁一样)

如果您在fd2上更改上述其中一项,则该更改将在fd1中可见,因为它们再次引用相同的底层 I/O 构造。当文件描述符跨进程复制(“继承”)时,也会发生同样的事情。

描述符本身只有一个有趣的属性 FD_CLOEXEC,它控制是否在execve调用期间保留(继承)描述符。这可能因每个描述符而异。


推荐阅读