Linux Fork Process终止

时间:2015-10-14 04:09:59

标签: c linux shell pipe fork

//Executing shell command ls -l | sort
int *pipeIN, *pipeOUT;

int runLS(){
    char* parmListLS[] = { "ls", "-l", NULL };
    int pid = fork();
    if(pid==0){
        close(*pipeIN);
        dup2(*pipeOUT, STDOUT_FILENO);
        execvp(parmListLS[0], parmListLS);
    }else return pid;
}

int runSORT(){
    char* parmListSORT[] = { "sort", NULL };
    int pid = fork();
    if(pid==0){
        close(*pipeOUT);
        dup2(*pipeIN, STDIN_FILENO);
        execvp(parmListSORT[0], parmListSORT);
    }else return pid;
}

int main(void){
    int pidLS, pidSort, pipeId[2];
    pipeIN = &pipeId[0], pipeOUT = &pipeId[1];
    pipe(pipeId); //open pipes

    pidLS = runLS();
    pidSort = runSORT();

    printf("PIDS: LS -> %d, Sort -> %d\n", pidLS, pidSort);
    printf("Terminated: %d\n", wait(NULL)); //return pid of 1st exited proc
    printf("Terminated: %d\n", wait(NULL)); //return pid of 2nd exited proc
    printf("Terminated Main Proccess!\n");
}

您好!我在制作一些简单的管道时遇到了麻烦。 我试图模仿shell命令ls - l |分类。 正如你所看到的,我正在初步化两个孩子的过程, 一个用于ls -l,另一个用于排序。 这些过程独立运行,我试图重定向输出 ls - l,作为通过管道排序的输入。这个概念就是主程序 应该等待他们两个终止。但是,等待似乎有效 很好的ls -l,但它挂起 - 永远不会终止排序。所以整个计划 挂起。如果我从程序中删除两个等待代码行,则ls - l - >分类 管道工作完美,当然主要终止于它们之前。 我怀疑这是因为排序一直在等待输入, 即使在ls -l终止之后。我不明白如何终止 父级会影响两个子进程的终止。 请问有什么人可以向我解释一下究竟会发生什么? 非常感谢你。 PS。我忽略了大多数错误检查的清晰度和较少的代码。

1 个答案:

答案 0 :(得分:5)

sort无法终止,因为父进程仍然打开了管道的写入结束(和读取结束),因此sort尚未达到EOF管道,因此它没有得到所有数据,所以它不能写任何输出。

添加:

close(pipeId[0]);
close(pipeID[1]);

调用runLS()runSORT()后,事情按预期进行。

理想情况下,孩子应该在管道复制之后关闭管道的两端。如果将管道文件描述符复制到标准文件流,则应该几乎总是关闭管道的两个端。在这段代码中,你没有这样做就逃之遥追;不会总是如此。

就个人而言,我并不认为这两个全局变量有多大帮助。标记为pipeIn的管道是sort的输入,但是ls的输出,例如。