私はpipe()システムコールを使用して、(任意の数のコマンドを使用して)パイピングをサポートするシェルを作成しようとしています。
残念ながら、pipe()を使用することはあまりできませんでした。さまざまなオンラインリソースを数日間調べた後、実行と同じ効果を持つ過度に単純化されたプログラムをまとめて、ls | sort
2つの兄弟の子プロセスでパイプを機能させることができるかどうかを確認することにしました。コードは次のとおりです。
#include <sys/wait.h>
#include <unistd.h>
void run(char *cmd) {
char *args[2];
args[0] = cmd;
args[1] = NULL;
execvp(cmd, args);
}
int main(void) {
int filedes[2];
pipe(filedes);
pid_t pid_a, pid_b;
if (!(pid_a = fork())) {
dup2(filedes[1], 1);
run("ls");
}
if (!(pid_b = fork())) {
dup2(filedes[0], 0);
run("sort");
}
waitpid(pid_a, NULL, 0);
waitpid(pid_b, NULL, 0);
return 0;
}
パイプは親で作成され、execvp()呼び出しの後、各子プロセスは、pipe()が親で作成するファイル記述子を継承することを知っています。プロセスでは、ls
dup2()を使用して標準出力(1)をパイプの書き込み端にリダイレクトし、sort
プロセスでは、標準入力(0)をパイプの読み取り端にリダイレクトしています。
最後に、両方のプロセスが終了するのを待ってから終了します。
私の直感では、これは機能するはずですが、機能しません。
助言がありますか?