如何知道两个 C 程序共享哪些输入文件?

How to know which input files are shared between two C programs?

当我在 Linux 中执行两个 C 程序时,我可以使用 fileno() 打印它们的 local/private 文件描述符。这意味着,当我 运行 并排放置两个独立的程序,并在每个程序中打印 fileno() 时,第一个打开的文件打印 3,第二个打开的文件打印 4,依此类推。

因此,通过使用 fileno(),无法知道它们之间共享了哪些输入文件。

有没有办法打印两个 C 程序共享的输入文件名?

使用

readlink /proc/<pid>/fd/* | sort -u > /tmp/process-<pid>.out

创建一个文件,其中包含由 PID <pid> 的进程打开的所有文件的列表。 然后使用comm(1)查找常用文件,如下:

comm -12 /tmp/process-<pid1>.out /tmp/process-<pid2>.out

请注意,这将列出这些程序共享的所有 个文件。

如果您知道程序使用的特定文件描述符是例如3,4,5,9,11,12,然后将第一个命令替换为:

readlink /proc/<pid>/fd/{3,4,5,9,11,12} | sort -u > /tmp/process-<pid>.out

如果您不知道文件描述符,并且想假设所有打开以供读取的文件描述符(包括标准输入)都是输入文件,则您必须通过阅读 /proc/<pid>/fdinfo/<file-descriptor>,它打印一个 flags 字段,其中包含该信息。