私はプログラムを持っていますa.outから実行しています/ tmp/test。 /proc/$(pgrep a.out)/cwd
をリストすると、それは/ tmp/testへのシンボリックリンクです。
ここで、/ 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。プロセスの開始時刻を確認して、マウントが起動された時刻と比較することはできましたが、フォークの可能性があるため、間違っている可能性があります。
_/proc/PID/cwd
_および他のディレクトリでstat(2)
を呼び出し、_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)
などはターゲットに従いませんが、動作します。それが参照する実際のオブジェクトに直接。