是否可以克隆文件描述符?我知道 dup
,但我想要一个文件描述符,它有一个单独的状态(位置),就好像我再次打开同一个文件,带有相同的标志(重新打开的问题打开是 a) 我必须存储文件路径,这在我的代码中目前不需要,并且 b) 如果文件已被删除,我无法重新打开它)。
如果不可能,那么我的想法是使用dup
,和pread
/pwrite
,所以我自己管理文件位置。这个想法有什么缺点吗?
最佳答案
我不相信有一个库函数或系统调用可以在 Linux 上做你想做的事。但您可以执行以下操作:
- 使用
readlink(3)
或realpath(3)
在文件上/proc/self/fd/<X>
, 其中<X>
是您要复制的文件描述符。这将返回相关文件的完整路径。 - 调用
open(2)
为该文件获取一个全新的描述符。 - 随心所欲地使用第二个文件描述符。它的
read(2)
s 和write(2)
s 是独立的。
这解决了您对存储文件路径的担忧,只需在需要时动态获取它。
我不明白你的第二点,关于删除文件的那一点。如果这个进程删除了文件,你为什么要为它创建一个重复的描述符?无论如何,如果这个或另一个进程删除了文件,那么在文件描述符本身关闭之前仍然可以访问该文件。像我上面描述的那样进行复制应该是有效的,直到每个 引用该文件的打开描述符被关闭。 (虽然您将无法使用链接 /proc/self/fd/<X>
如果此进程删除文件并关闭其描述符。您将需要另一种恢复文件名的方法来自文件描述符。但在那种情况下,这个问题没有多大意义,因为无论如何你不再有一个有效的描述符来复制!)
此外,创建第二个独立的文件描述符对我来说似乎是一个奇怪的设计选择。我可能会选择 lseek(2)
+ read(2)
或 pread(2)
.除了需要管理不同的文件位置外,我看不出这种方法有任何特别的缺点。
关于linux - 是否可以克隆文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878032/