子プロセスで 2 つ以上のパイプ コマンドをフォークして実行しようとしています。私の考えは、while ループを使用して、一方のプロセスでコマンドを継続的にフォークして実行し、他方のプロセスでループを継続することです。これが私のコードです:
void
execute_pipe_command(command_t *c)
{
command_t command = *c;
pid_t pid = fork();
if(pid > 0) {
int status;
while(waitpid(pid, &status, 0) < 0)
continue;
if(!WIFEXITED(status))
error(1, errno, "Child exit error");
command->status = WEXITSTATUS(status);
return;
} else if (pid == 0) {
while(command->type == PIPE_COMMAND)
{
int fd[2]; pipe(fd);
pid = fork();
if(pid > 0) {
close(fd[0]);
dup2(fd[1], STDOUT_FILENO);
char **args = command->u.command[1]->u.word;
execvp(args[0], args);
} else if (pid == 0) {
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
command = command->u.command[0];
continue;
} else {
error(1, errno, "forking error");
}
}
char **args = command->u.word;
execvp(args[0], args);
} else {
error(1, errno, "forking error");
}
}
コマンドはその型を保持する構造体であり、パイプ コマンドの場合は左右の子コマンドを保持します。それ以外の場合、単純なコマンドの場合、コマンドを構成する文字列の配列を保持します。
この関数をパイプコマンドで呼び出すとls | cat
、コマンドを実行する必要がありますが、代わりに奇妙な動作をします。最初の 2 つのパイプ コマンドは実行されますが、制御はプログラムに戻りません。代わりにハングします。後続のコマンドは単に無視されます。したがって、これを指定すると、ls | cat | wc
この関数は ls を出力し、SIGINT を指定するまで終了しません。
私は何が起こっているのかについてかなり混乱しています。誰かが問題を指摘できれば幸いです。