「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
。