如何知道两个 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
字段,其中包含该信息。
当我在 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
字段,其中包含该信息。