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