「Unixプログラミング環境」を読んでいるのですが、その概念が理解できませんカレントディレクトリプロセスの。
各プロセスには、カレントディレクトリ、すべてのファイル名は、スラッシュで直接始まっていない限り、暗黙的にそのディレクトリの名前で始まるものと想定されます。
すべてのプロセスには、それが作成されたディレクトリのサインがあるということですか? たとえば、プログラム/bin/sed
が から呼び出された場合/home/rene
、 sed を呼び出して作成されたプロセスには現在のディレクトリ があるのでしょうか/home/rene
?
答え1
概念レベル
シェルからプロセスを開始すると、プロセスの現在の作業ディレクトリは、シェルの現在の作業ディレクトリと同じになります。シェルのコンテキストでは、現在の作業ディレクトリは現在「いる」場所です。
プロセスの現在の作業ディレクトリは、相対パスの解釈に使用されます。たとえば、シェルの現在の作業ディレクトリが で/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
。
答え2
すべてのプロセスには、起動時に割り当てられる現在の作業ディレクトリ (CWD) があります。プロセスの作業ディレクトリを確認するには、次の手順に従います。
プロセスの PID を確認するには、ps aux を実行します。
$ 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