同一文件的 2 个文件描述符
2 file descriptors for the same file
对于已打开的文件,我有一个 >0 的文件描述符。
我想向该文件添加第二个文件描述符。我知道如果我再次使用第二个文件描述符打开文件是可能的,但问题是在我的代码中我不知道文件的名称。
所以我想知道我是否可以这样做:
fd2 = fd1;
您可以使用 dup
复制文件描述符,返回同一个打开的文件描述的新的、不同的句柄
#include <unistd.h>
int fd2 = dup(fd1);
#include <fcntl.h>
int fd2 = fcntl(fd1, F_DUFPD, 0); // consider F_DUPFD_CLOEXEC !
因为 fd2 和 fd1 现在引用 same open file description,它们“共享”底层打开文件的某些属性描述:
- 状态标志(非阻塞、仅追加等)
- 访问模式(只读、读写、只写)
- 文件位置(一个上的reading/seeking会反映在另一个上)
- 记录锁(与 POSIX
struct flock
锁一样)
如果您在 fd2 上更改上述其中一项,该更改将在 fd1 中可见,因为两者都指相同的底层 I/O 结构。当文件描述符跨进程复制(“继承”)时,也会发生同样的事情。
描述符本身只有一个有趣的属性,FD_CLOEXEC,它控制是否在 execve
调用中保留(继承)描述符。每个描述符可能不同。
对于已打开的文件,我有一个 >0 的文件描述符。 我想向该文件添加第二个文件描述符。我知道如果我再次使用第二个文件描述符打开文件是可能的,但问题是在我的代码中我不知道文件的名称。
所以我想知道我是否可以这样做: fd2 = fd1;
您可以使用 dup
#include <unistd.h>
int fd2 = dup(fd1);
#include <fcntl.h>
int fd2 = fcntl(fd1, F_DUFPD, 0); // consider F_DUPFD_CLOEXEC !
因为 fd2 和 fd1 现在引用 same open file description,它们“共享”底层打开文件的某些属性描述:
- 状态标志(非阻塞、仅追加等)
- 访问模式(只读、读写、只写)
- 文件位置(一个上的reading/seeking会反映在另一个上)
- 记录锁(与 POSIX
struct flock
锁一样)
如果您在 fd2 上更改上述其中一项,该更改将在 fd1 中可见,因为两者都指相同的底层 I/O 结构。当文件描述符跨进程复制(“继承”)时,也会发生同样的事情。
描述符本身只有一个有趣的属性,FD_CLOEXEC,它控制是否在 execve
调用中保留(继承)描述符。每个描述符可能不同。