同一文件的 2 个文件描述符

2 file descriptors for the same file

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

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

您可以使用 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 现在引用 same open file description,它们“共享”底层打开文件的某些属性描述:

  • 状态标志(非阻塞、仅追加等)
  • 访问模式(只读、读写、只写)
  • 文件位置(一个上的reading/seeking会反映在另一个上)
  • 记录锁(与 POSIX struct flock 锁一样)

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

描述符本身只有一个有趣的属性,FD_CLOEXEC,它控制是否在 execve 调用中保留(继承)描述符。每个描述符可能不同。