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

时间:2017-12-18 23:41:50

标签: linux file file-descriptor

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

如果无法实现,那么我的想法是使用duppread / pwrite,因此我自己管理文件位置。这个想法有什么缺点吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 在文件readlink(3)上使用realpath(3)/proc/self/fd/<X>,其中<X>是您要复制的文件描述符。这将返回相关文件的完整路径。
  2. 致电open(2)以获取该档案的全新描述。
  3. 根据需要使用第二个文件描述符。它的read(2)write(2)是独立的。
  4. 这可以解决您对存储文件路径的担忧,只需在需要时动态获取它。

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

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