Linux中另一个进程的重复文件描述符(无需使用sendmsg)

5

我手头有一个进程id和该进程的文件描述符。除了sendmsg之外,Linux是否有其他方式可以复制(或重新打开)该进程的文件描述符以供另一个进程使用?

Windows有DuplicateHandle用于此目的,我想知道Linux上是否有类似的功能。


1
简短的回答是:不行。原因是文件描述符只是一个索引,而每个进程的表都是唯一的,因此您不能在另一个进程中简单地使用一个进程的描述符。 - Some programmer dude
我已经更新了我的问题。我想在另一个进程中重新打开文件描述符。类似于这里所描述的,但不使用sendmsg。 - Sergey
1
答案仍然是否定的。如果您想在另一个进程中复制一个句柄,您必须使用 sendmsg 方法。难道另一个进程不能自己打开相同的文件,而不是试图从第一个进程获取描述符吗? - Some programmer dude
该文件可以被取消链接或替换,因此仅通过名称打开“相同”的文件并不能保证它会被打开,或者它将打开与原文件相同的文件,就我对Linux工作原理的理解而言。 - Sergey
2
能够从另一个进程复制任意文件描述符似乎是一个小的安全问题。在Windows中出现这种情况并不奇怪。(请注意“小”一词中滴落的讽刺意味) - William Pursell
2个回答

6
正如+vonbrand所指出的,您只需使用/proc/<pid>/fd/<fd>即可。 但是您不能仅仅在那里“写”,并且它不会提供任何的火花。
它是对正在进程中以文件描述符<fd>打开的文件的特殊符号链接,该进程具有pid <pid>
只需使用它,在您的进程中打开完全相同的文件。
您不必担心原始文件被删除或替换,因为使用此链接将始终为您提供进程打开的原始文件。 只需尝试以下简短的Bash代码片段:
#!/bin/bash
echo "test" >/tmp/file
ls -li /tmp/file
exec 3<> /tmp/file
rm /tmp/file
ls -lLi /proc/$$/fd/3
cat /proc/$$/fd/3

这将创建一个文件/tmp/file,其中包含字符串test。该文件作为文件描述符3打开,并在删除后仍然可以使用/proc/self/fd/3查看其内容。在Linux中,只要有任何进程仍在使用文件,该文件就不会被最终删除。

因此,不必获取和使用进程的文件描述符,只需打开该文件即可。

当然,您需要拥有权限才能这样做,如果您拥有两个进程或者您是根用户,则具备相应的权限/许可/特权。

编辑:如果不在bash中,您还可以使用/proc/self/...而不是/proc/$$/...来获取有关当前进程的信息。


这看起来正是我所需要的。我会试一试。 - Sergey
1
请注意:虽然使用另一个fd打开文件等操作是可行的,但在某些魔法设备文件中会出现问题,因为重要的是克隆fd而不是打开原始fd所引用的设备。 - TheDiveO

1
如果您拥有适当的权限,则PID为43512的进程的文件描述符5位于/proc/43512/fd/5。我从未过多地涉足这些领域(除了偷看),因此在那里写作可能效果良好,也可能会出现壮观的烟火。

你不能这样打开套接字:/ - ysdx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接