1

子プロセスで 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 を指定するまで終了しません。

私は何が起こっているのかについてかなり混乱しています。誰かが問題を指摘できれば幸いです。

4

1 に答える 1

0

while (command->type == PIPE_COMMAND)常に真です!このようにぶら下がっています。

于 2013-05-09T20:51:01.937 に答える