Linux 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"); } 

你好! 我无法在linux上制作一些简单的pipe道。 我试图模拟shell命令ls -l | 分类。 正如你所看到的,我正在初始化两个subprocess,一个用于ls -l,另一个用于sorting。 这些处理独立运行,我试图redirectls -l的输出,作为通过pipe道sorting的input。 这个概念是主程序应该等待两个终止。 然而,对于ls -l来说,等待似乎是正常的,但它挂起了 – 从不终止sorting。 所以整个程序挂起。 如果我从程序中删除了两个等待代码行,ls – l – >sortingpipe道完美工作,当然主要终止在它们之前。 我怀疑这是由于sorting不断等待input,即使ls -l已经终止。 我不明白如何终止父母影响终止这两个subprocess。 请有人向我解释发生了什么事吗? 非常感谢你。 PS。 我忽略了大多数错误检查的清晰度和更less的代码。

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

加:

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

在调用runLS()runSORT() ,事情按预期工作。

理想的情况下,孩子们在复制之后应该关闭管道的两端。 如果将管道文件描述符复制到标准文件流中,则应几乎总是关闭管道的两端。 在这个代码中,你不用做, 这并不总是如此。

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