execl()
現実的には、コマンドの引数の数がコンパイル時にわかっている場合にのみ、実際に使用できます。シェルでは、通常、代わりにexecv()
orを使用します。execvp()
これらは、実行するコマンドに対して任意の数の引数を処理できます。理論的にexecv()
は、コマンドのパス名が指定されている場合に使用し、指定execvp()
されていない場合に (コマンドの PATH ベースの検索を行います) を使用します。ただし、execvp()
「指定されたパス」のケースを処理するため、単純に を使用しますexecvp()
。
したがって、pipeline
コマンドの場合、次のようなものを使用して 1 つの子が作成されます。
char *args_1[] = { "ls", "-l", 0 };
execvp(args_1[0], args_1);
もう一方の子は、次のようなものを使用することになります。
char *args_2[] = { "grep", "pattern", 0 };
execvp(args_2[0], args_2);
もちろん、これらの文字列を、示されているように初期化するのではなく、コマンド ライン引数から作成したことを除きます。grep
検索するにはパターンが必要であることに注意してください。
解決すべき配管の問題がまだ残っています。十分なパイプ ファイル記述子を閉じていることを確認してください。dup()
標準入力またはdup2()
標準出力にパイプするときは、pipe()
関数から両方のファイル記述子を閉じます。