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()関数から両方のファイル記述子を閉じます。