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

标签 c linux ipc

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

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

最佳答案

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

它是一个特殊的符号链接(symbolic link),指向在 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/$$/...获取有关当前进程的信息。

关于c - Linux 中另一个进程的重复文件描述符(没有 sendmsg),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809333/

相关文章:

c++ - io_getevents 在短于超时的时间内返回的作业数量少于请求的数量

java - 为什么在 C 和 Java 中相同的代码会显示不同的行为?

c - Unix 的线程安全路径比较或规范化功能?

linux - 在 jail 中执行命令

c++ - IPC:在两个程序之间使用 C++ 中的命名管道

c++ - fork 并执行许多不同的进程,并从每个进程中获取结果

c - c中按位运算的解释

Linux/Qt 自动检测波特率?

c++ - 在 Linux 服务器上编译代码似乎运行方式不同

java - 通过套接字从 Objective-C 向 Java 发送数据