Linux中另一个进程的重复文件描述符(不带sendmsg)

时间:2013-04-04 11:02:51

标签: c linux ipc

我所拥有的是进程ID和来自该进程的文件描述符。除了sendmsg之外还有什么办法可以复制(或重新打开)该进程的文件描述符以供Linux中的另一个进程使用吗?

为此目的,Windows有DuplicateHandle,我想知道Linux上是否有类似内容。

2 个答案:

答案 0 :(得分:5)

正如+ vonbrand指出的那样,你可以使用/proc/<pid>/fd/<fd>。但你不能只是“写在那里”,它不会给任何坚固。

它是使用pid <pid>作为文件描述符<fd>在进程中打开的文件的特殊符号链接。

只需使用它在您的过程中打开完全相同的文件。

您不必担心原始文件被删除或替换,因为使用此链接将始终为您提供进程打开的原始文件。只需尝试以下一小部分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

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

因此,不要获取和使用进程的文件描述符,只需打开文件描述符“指向”的文件。

当然,您需要权限/权限/权限才能这样做。如果您拥有这两个进程或者您是root用户,那么您拥有哪些。

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

答案 1 :(得分:1)

如果您具有适当的权限,则使用PID 43512的进程的文件描述符5位于/proc/43512/fd/5。我从来没有和那些人讨论太多(除了看一看),所以在那里写作可能会很好或者会给壮观的烟火。