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

Posted

技术标签:

【中文标题】Linux中另一个进程的重复文件描述符(没有sendmsg)【英文标题】:Duplicate file descriptor of another process in Linux (without sendmsg) 【发布时间】:2013-04-04 11:02:50 【问题描述】:

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

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

【问题讨论】:

简短而唯一的答案是:不。原因是文件描述符只是表的索引,并且由于每个表对于每个进程都是唯一的,因此您不能简单地使用来自一个进程的描述符另一个。 我已经更新了我的问题。我想在另一个进程中重新打开文件描述符。类似于here 所描述的内容,但没有 sendmsg 答案仍然是否定的。如果你想在另一个进程中复制一个句柄,你可以使用sendmsg 方法。其他进程不能自己打开同一个文件而不是尝试从第一个进程获取描述符吗? 文件可以被取消链接或替换,因此按名称打开“相同”文件并不能保证它会被打开,或者它会打开同一个文件,据我所知,事情在 linux 中是如何工作的 从另一个进程复制任意文件描述符的能力感觉像是一个小的安全问题。在 Windows 中可以做到这一点并不奇怪。 (请注意“小”字上滴滴的讽刺) 【参考方案1】:

正如 +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 的形式打开文件,将其删除,删除后仍可以使用 /proc/self/fd/3 cat 其内容。在linux中,只要任何进程仍在使用文件,就不会最终删除它。

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

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

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

【讨论】:

这看起来正是我所需要的。会试试看。 请注意:当打开另一个 fd 可以处理文件时,它会产生一些魔术设备文件的问题,在这些文件中,克隆 fd 而不是打开原始 fd 引用的设备很重要.【参考方案2】:

如果您拥有适当的权限,PID 为 43512 的进程的文件描述符 5 位于 /proc/43512/fd/5。我从来没有把这些东西搞砸过(除了偷看),所以在那里写可能会很好,或者会放出壮观的烟花。

【讨论】:

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

以上是关于Linux中另一个进程的重复文件描述符(没有sendmsg)的主要内容,如果未能解决你的问题,请参考以下文章

内核状态如何在fork上重复?

获取Linux内核中另一个进程的每进程CPU时间时钟

Linux 进程线程文件描述符的底层原理

Linux查看进程打开多少文件描述符命令

调用C++类中另一个头文件中定义的函数[重复]

【fd】Linux文件描述符