回答:
概念レベル
シェルからプロセスを開始すると、プロセスの現在の作業ディレクトリは、シェルの現在の作業ディレクトリと同じになります。シェルのコンテキストでは、現在の作業ディレクトリは、現在「いる」場所です。
プロセスの現在の作業ディレクトリは、相対パスを解釈するために使用されます。たとえば、シェルの現在の作業ディレクトリが存在し、シェルから/home/rene
実行ls ..
した場合、プロセスの現在の作業ディレクトリは/home/rene
、に解決するため..
に使用されます/home
。
システムで実行中のすべてのプロセスの現在の作業ディレクトリを表示lsof | grep '\scwd\s'
できます(他のユーザーのプロセスを表示するには、rootである必要があることに注意してください)。これにより、現在の作業ディレクトリとシステムで実行中のプロセス。
プログラムレベル
シェルの現在の作業ディレクトリは、あなたが見るとシェル組み込みコマンドで変更したディレクトリであるpwd
とcd
それぞれ。これらのコマンドは、システムのような通話呼び出しgetcwd
やchdir
シェルの現在の作業ディレクトリでその仕事を。
bash
例として使用すると、cd
組み込みは最終的に次の行を実行します。
if (chdir (nolinks ? newdir : tdir) == 0)
そしてpwd
組み込みは最終的にこの行を実行します:
the_current_working_directory = getcwd (0, PATH_MAX);
シェルは、現在の作業ディレクトリの使用の便利な例にすぎません。これらの同じシステムコールは、他のプログラムでも使用されます。プログラムは現在の作業ディレクトリをに変更でき/usr
、プログラムが使用する相対パスはすべてディレクトリから始まります/usr
。
カーネルレベル
プロセスの現在の作業ディレクトリは、カーネルによって格納されます。Linuxはそれを保存するpwd
のメンバーfs_struct
によって指さfs
のメンバーtask_struct
。pwd
部材はpath
マウントに関する情報を指す構造体、(vfsmount
ファイルシステム内)とディレクトリの場所(dentry
)。各プロセスにはtask_struct
関連付けられています。
chdir
そしてgetcwd
システムコールは、変更との情報を取得しますpwd
。
すべてのプロセスには、起動時に割り当てられる現在の作業ディレクトリ(CWD)があります。次のようにして、プロセスの作業ディレクトリを見つけることができます。
ps auxを実行して、プロセスのPIDを確認します。
$ pgrep cupsd
24532
PIDの現在の作業ディレクトリを見つけるには:24532
$ sudo pwdx 24532
24532: /
したがって、プロセス(PID:24532)のCWDは/
です。
次に別の例を示します。
$ sleep 1000 &
[1] 15988
$ pwdx 15988
15988: /home/sam
今回のスリーププロセス(PID:15988)では、CWDがホームディレクトリに設定されてい/home/sam
ます。
ls -l
次のコマンドを実行することもできます。
$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /
-または-
$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam
ここでは、再び、これらのプロセスのためのCWDを参照してくださいすることができます/
と/home/sam
。