我有一个程序a. 输出逃离/tmp/测试。如果我列出/proc/$(pgrep a.out)/cwd
,它是一个符号链接/tmp/测试。
现在我绑定/mnt/其他测试到/tmp/测试和mount -o bind /mnt/othertest /tmp/test
。因此,这个新安装和旧安装堆叠在一起/tmp/测试被隐藏。
尽管如此,自从a. 输出在 mount 命令之前启动,它可以访问旧路径。
我想解决的问题是如何知道一个进程是否西德设置/tmp/测试指的是来自的目录/mnt/其他测试或不。
对于打开的文件,这很容易,我可以使用FD信息从进程伪文件系统并读取挂载ID,但我没有找到这样的信息西德。我可以检查进程的开始时间并将其与安装启动的时间进行比较,但由于可能存在分叉,它可能是错误的。
答案1
调用另一个目录并通过元组对它们进行stat(2)
比较。/proc/PID/cwd
device:inode
示例(请注意,除非给出-L
开关,否则stat(1)
实用程序将执行lstat(2)
系统调用而不是stat(2)
):
$ mkdir -p /tmp/foo /tmp/bar /tmp/baz
$ cd /tmp/foo
$ echo $$
20890
# mount -B /tmp/bar /tmp/foo
# stat -Lc %d:%i /proc/20890/cwd
2055:1835959
# stat -Lc %d:%i "$(readlink /proc/20890/cwd)" /tmp/foo /tmp/bar
2055:1843068
2055:1843068
2055:1843068
# umount /tmp/foo
# stat -Lc %d:%i /tmp/foo
2055:1835959
就像 , 下的文件一样/proc/PID/fd
,/proc/PID/cwd
不是真正的符号链接 - open(2)
,stat(2)
等不会跟随其目标,而是直接作用于它所引用的实际对象。