1

動作するものと動作しないもののようなものを実行しようとする 2 つのコード セットがありますls|grep pip

作業コードは2つの子プロセスを作成し、それぞれ1つの子を使用して1つのコマンドを実行し、もう1つは1つの子を作成してこれを実行しようとします。つまり、子で ls を実行し、親で grep を実行します。これはうまくいかないようです。また、エラーも発生しないようです。

誰かが私に何が問題なのか教えてもらえますか? そして、なぜそれが存在するのですか?

動作しない:

void runpipe()
{
    pid_t childpid;
    int fd[2];
    pipe(fd);
    int saved_stdout;
    int saved_stdin;
    saved_stdout=dup(STDOUT_FILENO);
    saved_stdin=dup(STDIN_FILENO);
    if((childpid=fork())==0)
    {
            dup2(fd[WRITE_END],STDOUT_FILENO);
            close(fd[WRITE_END]);
            execlp("/bin/ls","ls command","-l",NULL);

            dup2(STDOUT_FILENO,fd[1]);
            _exit(0);
    }
    else if(childpid>0)
    {

            dup2(saved_stdout,STDOUT_FILENO);
            dup2(fd[READ_END],STDIN_FILENO);
            close(fd[READ_END]);
            execlp("/bin/grep","grep","pip",NULL);
            wait();
            _exit(0);

    }
    else
    {
            printf("ERROR!\n");
    }
}

コードは次のとおりです。

働く:

    int runpipe(){
    pid_t pid;
    int fd[2];

    pipe(fd);
    int i;
    pid=fork();

    if (pid==0) {

            printf("i'm the child used for ls \n");
            dup2(fd[WRITE_END], STDOUT_FILENO);
            close(fd[READ_END]);
            execlp("ls", "ls", "-al", NULL);
            _exit(0);
    } else {
            pid=fork();

            if (pid==0) {
                    printf("i'm in the second child, which will be used to grep\n");
                    dup2(fd[READ_END], STDIN_FILENO);
                    close(fd[WRITE_END]);
                    execlp("grep", "grep","pip",NULL);
            }
            else wait();
    }
    return 0;
}

4

1 に答える 1

0

親は、grepを実行する前に、パイプの書き込み側を閉じる必要があります。何らかの理由で、2つの子を持つコードはそのファイル記述子を閉じますが、1つの子を持つコードには含まれません。いくつかの記述子を開いたままにしますが、パイプの書き込み側が重要です。リーダー(exec'd grep)は、パイプの書き込み側のすべてのコピーが閉じられるまで終了しません。それを閉じないことによって、grepはそれを開いたままにするものであるため、grepは決して終了せず、データが増えるのを待つだけです。

于 2012-09-13T22:03:28.880 に答える