linux - 是否可以克隆文件描述符?

标签 linux file file-descriptor

是否可以克隆文件描述符?我知道 dup,但我想要一个文件描述符,它有一个单独的状态(位置),就好像我再次打开同一个文件,带有相同的标志(重新打开的问题打开是 a) 我必须存储文件路径,这在我的代码中目前不需要,并且 b) 如果文件已被删除,我无法重新打开它)。

如果不可能,那么我的想法是使用dup,和pread/pwrite,所以我自己管理文件位置。这个想法有什么缺点吗?

最佳答案

我不相信有一个库函数或系统调用可以在 Linux 上做你想做的事。但您可以执行以下操作:

  1. 使用readlink(3)realpath(3)在文件上 /proc/self/fd/<X> , 其中<X>是您要复制的文件描述符。这将返回相关文件的完整路径。
  2. 调用open(2)为该文件获取一个全新的描述符。
  3. 随心所欲地使用第二个文件描述符。它的read(2) s 和 write(2) s 是独立的。

这解决了您对存储文件路径的担忧,只需在需要时动态获取它。

我不明白你的第二点,关于删除文件的那一点。如果这个进程删除了文件,你为什么要为它创建一个重复的描述符?无论如何,如果这个或另一个进程删除了文件,那么在文件描述符本身关闭之前仍然可以访问该文件。像我上面描述的那样进行复制应该是有效的,直到每个 引用该文件的打开描述符被关闭。 (虽然您将无法使用链接 /proc/self/fd/<X> 如果进程删除文件关闭其描述符。您将需要另一种恢复文件名的方法来自文件描述符。但在那种情况下,这个问题没有多大意义,因为无论如何你不再有一个有效的描述符来复制!)

此外,创建第二个独立的文件描述符对我来说似乎是一个奇怪的设计选择。我可能会选择 lseek(2) + read(2)pread(2) .除了需要管理不同的文件位置外,我看不出这种方法有任何特别的缺点。

关于linux - 是否可以克隆文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878032/

相关文章:

perl - 在 perl 中打开文件进行读写(不附加)

select - socket编程中如何使用select()函数?

linux - 从 txt 文件 unix 中选择错误的列值

java - .listFiles() 返回的文件对象在 .exists() 上返回 false - 文件包含特殊字符

android - 通过android终端访问蓝牙RFCOMM

将 .txt 文件中的唯一词复制到链表

linux - 系统调用如何知道文件描述符属于哪个进程?

c - 关于在c中更改文件描述符编号的问题

linux - 安装 Qt 5.8 后所有 qt 应用程序停止工作

linux - 使用 bash 对文件进行算术运算