[英]Linux Fork Process termination
//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上工作时遇到麻烦。 我正在尝试模拟shell命令ls-l | 分类。 如您所见,我正在初始化两个子过程,一个用于ls -l,另一个用于排序。 这些过程独立运行,我正在尝试将ls-l的输出重定向为通过管道进行排序的输入。 概念是主程序应等待它们都终止。 但是,对于ls -l来说,wait似乎工作正常,但是挂起了-永远不会终止排序。 因此,整个程序挂起。 如果我从程序中删除了两条等待代码行,则ls-l-> sort管道可以完美运行,当然main在它们之前终止。 我怀疑这是由于这样的事实,即使ls-l终止后,sort仍在等待输入。 我不了解父级的终止如何影响两个子进程的终止。 有人能对我解释一下实际情况吗? 非常感谢你。 PS。 为了清晰和减少代码,我忽略了大多数错误检查。
sort
无法终止,因为父进程仍然打开了管道的写入端(和读取端),因此sort
尚未达到管道上的EOF,因此它没有获取所有数据,因此不能写任何输出。
加:
close(pipeId[0]);
close(pipeID[1]);
在调用runLS()
和runSORT()
,一切按预期进行。
理想情况下,孩子们在刚复制完之后应该关闭管道的两端。 如果你复制一个管道的文件描述符到标准文件流,你应该总是关闭管道的两端 。 在此代码中,您无需做就可以逃脱。 并非总是如此。
我个人认为这两个全局变量没有太大帮助。 例如,标记为pipeIn
的管道是要sort
的输入,但是ls
的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.