c - 同一文件的 2 个文件描述符
问题描述
对于已打开的文件,我有一个 >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现在引用相同的打开文件描述,它们“共享”底层打开文件描述的某些属性:
- 状态标志(非阻塞、仅附加等)
- 访问模式(只读、读写、只写)
- 文件位置(阅读/寻找一个将反映在另一个)
- 记录锁(与 POSIX
struct flock
锁一样)
如果您在fd2上更改上述其中一项,则该更改将在fd1中可见,因为它们再次引用相同的底层 I/O 构造。当文件描述符跨进程复制(“继承”)时,也会发生同样的事情。
描述符本身只有一个有趣的属性 FD_CLOEXEC,它控制是否在execve
调用期间保留(继承)描述符。这可能因每个描述符而异。
推荐阅读
- python - 我怎样才能逐一检查列表中的每个项目,中间有延迟?
- javascript - 如何获得背景颜色和颜色不同的字符串?
- css - 如何缩短bulma输入?
- gcloud - G Suite 的 G 云 MX 记录中的首选项和邮件服务器无效记录数据
- angular - Angular 中的 Vue.prototype 等价物是什么?
- rust - 重载引用和值调用
- java - 使用带有嵌套静态类的类的好习惯,然后用更多静态方法扩展包私有抽象类以保持组织?
- google-sheets - 谷歌表格中的第 2 页是否有自动输入建议列表,只输入 1 或 2 个字符?
- r - 如何提高循环操作的性能
- jax-rs - TomEE JAX-RS java.lang.NoSuchMethodError javax.ws.rs.core.Link.fromUri