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

如何知道两个C程序之间共享哪些输入文件?,c,linux,file-descriptor,C,Linux,File Descriptor,当我在Linux中执行两个C程序时,我可以使用fileno()打印它们的本地/私有文件描述符。这意味着,当我并排运行两个独立的程序,并在每个程序中打印fileno(),打开的第一个文件打印3,打开的第二个文件打印4,依此类推 因此,通过使用fileno(),不可能知道它们之间共享了哪些输入文件 有没有办法打印两个C程序共享的输入文件名?使用 readlink /proc/<pid>/fd/* | sort -u > /tmp/process-<pid>.out 请

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

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

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

使用

readlink /proc/<pid>/fd/* | sort -u > /tmp/process-<pid>.out
请注意,这将列出这些程序共享的所有文件

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

readlink /proc/<pid>/fd/{3,4,5,9,11,12} | sort -u > /tmp/process-<pid>.out
readlink/proc//fd/{3,4,5,9,11,12}排序-u>/tmp/process-.out
如果您不知道文件描述符,并且希望假定所有打开以供读取的文件描述符(包括stdin)都是输入文件,那么您必须通过读取
/proc//fdinfo/
来做一些更聪明的事情,它会打印一个
标志
字段,该字段包含该信息。

使用

readlink /proc/<pid>/fd/* | sort -u > /tmp/process-<pid>.out
请注意,这将列出这些程序共享的所有文件

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

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

如果您不知道文件描述符,并且希望假定所有打开读取的文件描述符(包括stdin)都是输入文件,那么您必须通过读取
/proc//fdinfo/
来做一些更聪明的事情,它打印一个
标志
字段,该字段包含该信息。

一般来说,您无法轻易判断。每个程序都知道它使用哪些文件,但都不知道其他程序使用哪些文件。您是否需要一个管理程序来运行这两个程序并跟踪情况?哪个程序需要知道?为什么两个程序都需要知道?而且文件描述符数字不会告诉你任何事情——它们本身也不会告诉你。您可能会从文件描述符上的
fstat()
中获得有用的信息,但仅仅比较数字并不能告诉您任何事情。您可能可以通过
lsof
和一个快速的Perl或awk脚本来解决它。
strace
还可以显示每个进程打开的每个文件。但这不能在过程开始后进行。一般来说,你不能轻易判断。每个程序都知道它使用哪些文件,但都不知道其他程序使用哪些文件。您是否需要一个管理程序来运行这两个程序并跟踪情况?哪个程序需要知道?为什么两个程序都需要知道?而且文件描述符数字不会告诉你任何事情——它们本身也不会告诉你。您可能会从文件描述符上的
fstat()
中获得有用的信息,但仅仅比较数字并不能告诉您任何事情。您可能可以通过
lsof
和一个快速的Perl或awk脚本来解决它。
strace
还可以显示每个进程打开的每个文件。但这不能在进程启动后完成。我相信上面的
Linux
标记可以确定
c
程序运行在哪个操作系统上。你可能是对的,因此没有丁,但我怀疑他在寻找
c
解决方案,而不是posixshell解决方案。(注意:
fileno
是由带有gcc的
stdio.h
提供的POSIX扩展名)这不是假设一个名称唯一地标识一个文件吗?因为这在Linux上不是真的。@melpomene Linux记得打开文件的硬链接。但是,如果文件在打开后被移动,那将不起作用。我相信上面的
Linux
标记限定了
c
程序在哪个操作系统上运行。你可能是对的,因此没有丁,但我怀疑他在寻找
c
解决方案,而不是posixshell解决方案。(注意:
fileno
是由带有gcc的
stdio.h
提供的POSIX扩展名)这不是假设一个名称唯一地标识一个文件吗?因为这在Linux上不是真的。@melpomene Linux记得打开文件的硬链接。但是,如果文件在打开后被移动,那就行不通了。