
「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
aメンバーfs_struct
が指すfs
aメンバーに保存しますtask_struct
。このpwd
メンバーは、path
マウント(vfsmount
)に関する情報とdentry
ファイルシステム()内のディレクトリの場所に関する情報を指す構造です。すべてのプロセスにはtask_struct
これに関連するプロセスがあります。
chdir
そして、getcwd
情報を修正して検索するシステムコールがありますpwd
。
答え2
各プロセスには、起動時に割り当てられる現在の作業ディレクトリ(CWD)があります。次の手順を実行して、プロセスの作業ディレクトリを見つけることができます。
ps auxを実行してプロセスのPIDを確認します。
$ pgrep cupsd
24532
PIDの現在の作業ディレクトリを探す:24532
$ sudo pwdx 24532
24532: /
したがって、プロセスのCWD(PID:24532)はです/
。
別の例は次のとおりです。
$ 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