各プロセスが現在のディレクトリを持っているとはどういう意味ですか?


10

私は「The Unix Programming Environment」を読んでいますが、プロセスの現在のディレクトリという概念を理解していません。

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

すべてのプロセスが、それが作成されたディレクトリにサインがあることを意味しますか?たとえば、プログラム/bin/sedがから呼び出された場合/home/rene、sedの呼び出しから作成されたプロセスには現在のディレクトリがあり/home/reneますか?

回答:


13

概念レベル

シェルからプロセスを開始すると、プロセスの現在の作業ディレクトリは、シェルの現在の作業ディレクトリと同じになります。シェルのコンテキストでは、現在の作業ディレクトリは、現在「いる」場所です。

プロセスの現在の作業ディレクトリは、相対パスを解釈するために使用されます。たとえば、シェルの現在の作業ディレクトリが存在し、シェルから/home/rene実行ls ..した場合、プロセスの現在の作業ディレクトリは/home/rene、に解決するため..に使用されます/home

システムで実行中のすべてのプロセスの現在の作業ディレクトリを表示lsof | grep '\scwd\s'できます(他のユーザーのプロセスを表示するには、rootである必要があることに注意してください)。これにより、現在の作業ディレクトリとシステムで実行中のプロセス。

プログラムレベル

シェルの現在の作業ディレクトリは、あなたが見るとシェル組み込みコマンドで変更したディレクトリであるpwdcdそれぞれ。これらのコマンドは、システムのような通話呼び出しgetcwdchdirシェルの現在の作業ディレクトリでその仕事を。

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_structpwd部材はpathマウントに関する情報を指す構造体、(vfsmountファイルシステム内)とディレクトリの場所(dentry)。各プロセスにはtask_struct関連付けられています。

chdirそしてgetcwdシステムコールは、変更との情報を取得しますpwd


さらに、カーネルレベルでは、システムコールが行われると、「現在の」task_structへのポインターが存在することを覚えておくと便利です。そのため、コードは現在のプロセスの「代わりに」実行されます。fs_struct現在task_structへのポインタを介してアクセスすることができる。elixir.free-electrons.com/linux/v4.12.4/source/fs/...
Dmitrii S.

1

すべてのプロセスには、起動時に割り当てられる現在の作業ディレクトリ(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

参考文献

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.