【问题标题】:Emulating pipes模拟管道
【发布时间】:2012-12-13 04:06:41
【问题描述】:

我最近刚刚了解了管道,我想效仿“|” shell提供的噱头。

在下面的代码中,父进程产生了 2 个子进程,之后它们进行管道处理并被 ls 和 grep 替换。发生这种情况时,父进程会耐心等待。问题是子进程永远不会完成,尽管它们设法通过管道将一些数据发送到屏幕上。

还有其他关于 SO 上的管道的帖子,但我从未见过父进程启动 2 个子进程的设置。我只见过家长和一个孩子交流。

int p0[2];
pipe(p0);         //creating pipe

if(fork() == 0) { //child 1
    dup2(p0[0], STDIN_FILENO);
    close(p0[0]); close(p0[1]);
    execlp("grep","grep","a",NULL);
} 
else {            //parent
    if(fork() == 0) { //child 2
        dup2(p0[1], STDOUT_FILENO);
        close(p0[0]); close(p0[1]);
        execlp("ls","ls",NULL);
    }
    else {    //parent
        wait(NULL);
        wait(NULL); //waiting for c1 and c2

        close(p0[0]); close(p0[1]);
        printf("parent exit\n");
    }
}

我的问题是:为什么子进程没有完成?叉管结构好听还是我做错了?

【问题讨论】:

    标签: fork pipe dup2


    【解决方案1】:

    在最后一段开始等待之前关闭管道。

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2017-01-10
      • 2019-06-30
      相关资源
      最近更新 更多