4

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

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

4

2 回答 2

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

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

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

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

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

于 2013-04-04T18:03:54.233 回答
1

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

于 2013-04-04T17:40:05.873 回答