web-dev-qa-db-ja.com

プロセスの現在の作業ディレクトリが対応するマウントポイントを見つける方法は?

私はプログラムを持っていますa.outから実行しています/ tmp/test/proc/$(pgrep a.out)/cwdをリストすると、それは/ tmp/testへのシンボリックリンクです。

ここで、/ mnt/othertest/ tmp/testmount -o bind /mnt/othertest /tmp/testでバインドします。したがって、この新しいマウントはスタックされ、古い/ tmp/testは非表示になります。

それでも、a.outはmountコマンドの前に起動されたため、古いパスにアクセスできます。

私が取り組みたい問題は、cwd/ tmp/testに設定されているプロセスが/ mnt/othertestのディレクトリを参照しているかどうかを知る方法です。 =かどうか。

開いているファイルの場合、簡単です。proc pseudo-filesysteからfdinfoを使用して、マウントIDを読み取ることができますが、cwd。プロセスの開始時刻を確認して、マウントが起動された時刻と比較することはできましたが、フォークの可能性があるため、間違っている可能性があります。

3
rools

_/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)などはターゲットに従いませんが、動作します。それが参照する実際のオブジェクトに直接。

2
mosvy