すべてのプロセスに現在のディレクトリがあるとはどういう意味ですか?

すべてのプロセスに現在のディレクトリがあるとはどういう意味ですか?

「Unixプログラミング環境」を読んでいますが、概念を理解していません。現在のディレクトリのコース。

すべてのプロセスに現在のディレクトリ、すべてのファイル名は、スラッシュで直接起動しない限り、暗黙的にそのディレクトリの名前で始まると想定されます。

これは、すべてのプロセスが作成されたディレクトリにフラグを持つことを意味しますか?たとえば、プログラムは?/bin/sedから呼び出されると、/home/renesedを呼び出して作成されたプロセスは現在のディレクトリを持ちます。/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は、それをpwdaメンバーfs_structが指すfsaメンバーに保存します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

引用する

関連情報