我有一个从/tmp/test运行的程序a.out。如果我列出,它是/tmp/test的符号链接。/proc/$(pgrep a.out)/cwd
现在,我将/mnt/othertest绑定到/tmp/test上mount -o bind /mnt/othertest /tmp/test
。因此,这个新的挂载被堆叠起来,而旧的/tmp/test被隐藏了。
尽管如此,由于a.out在 mount 命令之前启动,它可以访问旧路径。
我要解决的问题是如何知道cwd设置为/tmp/test的进程是否引用/mnt/othertest中的目录。
对于打开的文件,这很容易,我可以使用proc pseudo -filesyste 中的fdinfo并读取挂载 ID,但我没有找到cwd的此类信息。我可以检查进程的开始时间并将其与 mount 启动的时间进行比较,但由于可能存在分叉,它可能是错误的。
调用另一个目录并通过元组比较
stat(2)
它们。/proc/PID/cwd
device:inode
示例(请注意,除非给出
-L
开关,否则该stat(1)
实用程序将执行lstat(2)
系统调用而不是 astat(2)
):就像 , 下的文件一样
/proc/PID/fd
,/proc/PID/cwd
不是真正的符号链接——一个open(2)
,stat(2)
等不会跟随它的目标,而是直接作用于它所指的实际对象。