Linux
如何找到程序的目前工作目錄對應的掛載點?
我有一個從*/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)
):$ 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)
等不會跟隨它的目標,而是直接作用於它所指的實際對象。