【问题标题】:no result!! using fork() to run execlp() with 2 pipes using dup2没有结果!!使用 fork() 使用 dup2 使用 2 个管道运行 execlp()
【发布时间】:2012-12-26 17:47:46
【问题描述】:

我正在编写一个可以运行 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);
        }
    }
}

【问题讨论】:

  • 管道的一个方面是并发性,尤其是在具有多核的现代计算机上。通常,您不能等待管道中的第一个进程完成后再启动第二个进程,因为第一个进程可能会生成比管道中存储的数据更多的数据。您最终会看到第一个进程等待第二个进程读取,而第二个进程在启动其工作代码之前等待第一个进程死亡。在execlp() 调用之后,您还应该有错误报告代码,以防execlp() 失败。
  • @falcon1990 子进程不需要wait(),,,我想分享一个链接A Good Code for Shell

标签: c linux exec fork pipe


【解决方案1】:
    pid_t pfils = fork();
    pipe(fd);

Fork 将复制该过程。流程的独立副本。因此,如果您在 fork 之后调用管道,则该进程的每个副本都会获得自己的管道。将 pipe() 放在 fork() 之前,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多