2

我正在编写一个将运行 Linux 命令的 C 程序,例如:
cat /etc/passwd | grep list | cut -c 1-5
我没有任何结果
*这里父母等待第一个孩子(child_pid)完成;
第一个孩子等待第二个(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 之后调用管道,则进程的每个副本都会获得自己的管道。将 pipe() 放在 fork() 之前,它应该可以工作。

于 2013-01-12T04:28:09.290 回答