Linux 分叉进程终止
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 很好,但它挂起 - 永远不会因排序而终止。所以整个程序
挂起。如果我从程序中删除两个等待代码行,则 ls - l -> sort
pipe 工作完美,当然 main 在它们之前终止。
我怀疑这是因为 sort keeps 等待输入,
即使在 ls - l 终止之后。我不明白如何终止
父进程影响两个子进程的终止。
谁能好心向我解释一下到底发生了什么?
非常感谢你。 ps。为了清晰和更少的代码,我忽略了大多数错误检查。
sort
无法终止,因为parent进程仍有管道的写端(和读端)打开,所以sort
还没有到达EOF 在管道上,所以它还没有得到所有的数据,所以它不能写任何输出。
添加:
close(pipeId[0]);
close(pipeID[1]);
在调用 runLS()
和 runSORT()
之后,一切都按预期进行。
理想情况下,children 应该在刚刚复制后关闭管道的两端。如果将管道文件描述符复制到标准文件流,则几乎应该始终关闭管道的 both 端。在这段代码中,你不用做就可以逃脱;情况并非总是如此。
就我个人而言,我认为这两个全局变量帮助不大。例如,标有 pipeIn
的管道是 sort
的输入,但 ls
的输出。
//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 很好,但它挂起 - 永远不会因排序而终止。所以整个程序 挂起。如果我从程序中删除两个等待代码行,则 ls - l -> sort pipe 工作完美,当然 main 在它们之前终止。 我怀疑这是因为 sort keeps 等待输入, 即使在 ls - l 终止之后。我不明白如何终止 父进程影响两个子进程的终止。 谁能好心向我解释一下到底发生了什么? 非常感谢你。 ps。为了清晰和更少的代码,我忽略了大多数错误检查。
sort
无法终止,因为parent进程仍有管道的写端(和读端)打开,所以sort
还没有到达EOF 在管道上,所以它还没有得到所有的数据,所以它不能写任何输出。
添加:
close(pipeId[0]);
close(pipeID[1]);
在调用 runLS()
和 runSORT()
之后,一切都按预期进行。
理想情况下,children 应该在刚刚复制后关闭管道的两端。如果将管道文件描述符复制到标准文件流,则几乎应该始终关闭管道的 both 端。在这段代码中,你不用做就可以逃脱;情况并非总是如此。
就我个人而言,我认为这两个全局变量帮助不大。例如,标有 pipeIn
的管道是 sort
的输入,但 ls
的输出。