ご質問について:
manページではexecvp
、プロセスイメージのイメージを新しいイメージに置き換えると書かれています。ただし、ここでは実行可能ファイルではなくコマンドを実行しています。
はるか昔、シェルは非常に限られており、ほとんどすべての UNIX コマンドはスタンドアロンの実行可能ファイルでした。現在、主に速度を向上させるために、UNIX コマンドの一部のサブセットがシェル自体の内部に実装されており、これらのコマンドは と呼ばれbuiltins
ます。type
コマンドを介して、シェルに組み込みとして実装されているかどうかを確認できます。
λ ~/ type echo
echo is a shell builtin
man
(説明付きのビルトインの完全なリストは、シェルなどのページman bash-builtins
で見つけることができますman builtin
。)
ただし、ほとんどのコマンドには、実行可能なカウンターパートがまだあります。
λ ~/ whereis echo
/bin/echo
したがって、実行中の特定のケースでは:
char* arg[] = {"ls", "-l", NULL};
execvp(arg[0],arg);
実際には、現在のプロセスのアドレス空間を (おそらく) のアドレス空間に置き換えています/bin/ls
。
私の直感では、ファイルを読み取る必要があり、それを解析して引数を引数に格納する必要があります。
確かにあなたは持っています。ただし、別名「シバン」にいくつかのカーネル内関数を使用することもできます。
ファイル名を別のファイルに入れる代わりに、cat するファイルの最初の行として、いわゆるシバンを追加します。
#!/bin/cat
それに追加chmod +x
します。次に、実行可能ファイルとして実行できます (exec
関数またはシェルのいずれかを使用)。
λ ~/tmp/ printf '#!/bin/cat\nTEST\n' > cat_me
λ ~/tmp/ chmod +x cat_me
λ ~/tmp/ ./cat_me
#!/bin/cat
TEST
原因は、ファイルで自分自身を印刷するという欠点がありshebang
ますが、それでもカーネル内で行うのは楽しいです =)
ところで。xargs
標準入力を介して渡された引数のリストで特定のプログラムを実行する(非常に単純化された説明で)呼び出される特別な実行可能ファイルがあるほど一般的である場合に説明した問題。詳細については、に相談してくださいman xargs
。
-family を簡単にexec
覚えるために、次の表をよく使用します。
Figure 8.14. Differences among the six exec functions
+----------+----------+----------+----------+--------+---------+--------+
| Function | pathname | filename | agr list | argv[] | environ | envp[] |
+----------+----------+----------+----------+--------+---------+--------+
| execl | * | | * | | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execlp | | * | * | | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execle | * | | * | | | * |
+----------+----------+----------+----------+--------+---------+--------+
| execv | * | | | * | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execvp | | * | | * | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execve | * | | | * | | * |
+----------+----------+----------+----------+--------+---------+--------+
| letter | | p | l | v | | e |
+----------+----------+----------+----------+--------+---------+--------+
したがって、あなたの場合execvp
、ファイル名、argv( v ) および Environment( e ) を取ります。次に、実行可能なパスが見つかるまで、各パスコンポーネントにfilename
(あなたの場合は)を追加することにより、パス名(別名フルパス)を「推測」しようとします。cat
PATH
filename
exec
の内部で行われていること (継承関係を含む)に関するより多くの情報は、W. Richard Stevens と Stephen A. Rago aka APUE2 による UNIX 環境での高度なプログラミング (第 2 版) にあります。
UNIX の内部に興味がある場合は、おそらくそれを読む必要があります。