実行するプログラムの名前だけが与えられた場合、Unixはプログラムの絶対パスをどのように知ることができますか?

実行するプログラムの名前だけが与えられた場合、Unixはプログラムの絶対パスをどのように知ることができますか?

実行するプログラムを作成するときに、プログラムが作成された作業ディレクトリに関連しているとします。

答え1

完全パスまたは相対パスなしでプログラムを呼び出し、プログラムが関数または組み込みではないと仮定すると、そのプログラムを見つけるにはPATH環境変数に存在する必要があります。

3.7.2 命令の検索と実行

Bashは、複数のPATH検索を回避するために実行可能ファイルのフルパス名を記憶するためにハッシュテーブルを使用します(Bourne Shell組み込み関数のハッシュ説明を参照)。 $ PATHのディレクトリの完全検索は、ハッシュテーブルでコマンドが見つからない場合にのみ実行されます。検索に失敗すると、シェルはcommand_not_found_handleという定義されたシェル関数を検索します。関数が存在する場合は、元のコマンドと元のコマンドの引数を引数として別々の実行環境で呼び出され、関数の終了状態はサブシェルの終了状態になります。この関数が定義されていない場合、シェルはエラーメッセージを出力し、終了ステータス127を返します。

答え2

プログラムが実行されると、呼び出し元プログラム(通常はシェル)は、PATH環境変数にリストされているディレクトリからルールに従ってプログラムを検索します。この目的のために、呼び出しプログラムはexeclp、、、またはexecvp同じライブラリ関数を使用してexecvpe検索を実行したり、呼び出しプログラム自体で同様のロジックを実装できます。

ライブラリ関数は最終的にexecveプログラムの実際の実行の主な力であるシステムコールを呼び出します。呼び出しexecveは、プログラムを含むファイルの名前であるファイル名を最初の引数として使用します。名前は通常ファイルの絶対パスですが、相対パスでもかまいません。この場合、ファイルの検索はプロセスの現在のディレクトリから始まります。 (ファイルを現在のディレクトリに含める必要はありません。たとえば、名前は。../../myprogram)システムコールは環境変数をexecve考慮しません。PATH

もしそうなら、システムコールに相対パスが与えられたら、カーネルはプログラムの絶対パスをどのように知ることができますかexecve?答えは「いいえ」であり、必要はありません。

関連情報