2

次のような Linux コマンドを実行する C プログラムを作成しています
cat /etc/passwd | grep list | cut -c 1-5
が、結果がありません
でした。
最初の子は 2 番目の子 (pfils) を待ちます !!
何か案が?
コード:

main()
{
    pid_t child_pid;
    int fd[2];
    int pfd[2];
    pipe(pfd);
    child_pid = fork ();

    if (child_pid != 0) 
    {
        wait(child_pid);
        close(pfd[1]);
        dup2(pfd[0],0);
        close(pfd[0]);
        execlp("cut","cut","-c","1-5",NULL);
    }
    else
    {
        pid_t pfils = fork();
        pipe(fd);

        if(pfils == 0)
        {
            close(fd[0]);
            dup2(fd[1],1);
            close(fd[1]);
            execlp("cat", "cat","/etc/passwd",NULL);
        }
        else
        {
            wait(pfils);
            close(fd[1]);
            dup2(fd[0],0);
            close(fd[0]);
            close(pfd[0]);
            dup2(pfd[1],1);
            close(pfd[1]);
            execlp("grep","grep","list",NULL);
        }
    }
}
4

1 に答える 1

5
    pid_t pfils = fork();
    pipe(fd);

Fork はプロセスのコピーを作成します。プロセスの独立したコピー。そのため、fork の後にパイプを呼び出すと、プロセスの各コピーが独自のパイプを取得します。fork() の前に pipe() を配置すると、機能するはずです。

于 2013-01-12T04:28:09.290 に答える