3

私はCで簡単なシェルを書いています。コマンドを実行するために、シェルは基本的に子プロセスを作成し、その後同じプロセスを実行してコマンドを実行します。

次のように関数 execve を使用しています。

execve(argList[0],argList,envList);

ここで、argList と envList は、(たとえば) 次の値を持つ char*(string) 配列です。

argList={"ls",NULL}
envList={"/bin",NULL}

lsは /bin ディレクトリに実行可能ファイルとして存在するため、必要な exec は ls と同じ効果を持つはずです (もちろん LINUX システムでは)。

ただし、execve コマンドは、環境内のディレクトリに存在する実行可能ファイルに対して実行できません。

現在の作業ディレクトリで実行可能ファイルを実行する場合も、同じことが完全に機能します。

どこが間違っていますか?


結論:私は環境をまったく別のものと間違えていました。[お詫び:)] 環境配列は、子プロセスの環境を設定する責任が。 したがって、ジムが指摘したように、正しい手順は環境変数を次の形式で設定することです。

envList = { "HOME=/root", PATH="/bin:/sbin", NULL }

ここでも説明されているように。

さらに、(execvp の代わりに) execve を使用して上記の結果を達成するために、Nemo が説明しているように、PATH 内のディレクトリを常に繰り返し呼び出すことができます。ファイルが存在しない場合、execve は失敗します。

4

2 に答える 2

3

execve検索しませんPATHexeclpまたは類似のものを使用する必要があります。詳細については、POSIX リファレンスを参照してください。

Linux では が必要になる場合がありますがexecvpe、これは標準ではありません。

(また、これらの関数は標準 C の一部ではありません。「posix」や「linux」など、プラットフォーム固有のタグを質問に追加する必要があります。)

于 2013-01-12T05:30:11.323 に答える
2
envList={"/bin",NULL}

これは正しくありません。envList は、execed プログラムの環境文字列を提供します。これは検索リストではありません。正しいenvListはもっと似ているでしょう

envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
于 2013-01-12T06:07:05.580 に答える