【问题标题】:2 file descriptors for the same file同一文件的 2 个文件描述符
【发布时间】:2021-08-08 16:21:58
【问题描述】:

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

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

【问题讨论】:

  • 非常感谢 ;-)
  • 对不起,我没有很好地理解手册。如果我 lseek for oldfd 将其位置更改为文件,newfd 也会转到相同的位置吗?有什么办法可以让文件描述符在文件中的不同位置,并对每个位置执行不同的任务?
  • 好的,再次感谢您
  • @Someprogrammerdude 是时候删除我的 cmets 了!
  • @pilcrow 并为你的好答案 +1 :)

标签: c unix file-descriptor


【解决方案1】:

您可以复制文件描述符,为同一打开的文件描述返回一个新的、不同的句柄,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,它们“共享”底层打开文件描述的某些属性:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2014-04-25
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多