Linux Fork Process终止

Fru*_*oul 2 c linux shell fork pipe

//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");
}
Run Code Online (Sandbox Code Playgroud)

你好!我无法在Linux上使用一些简单的管道.我正在尝试模拟shell命令ls - l | 分类.正如你所看到的,我正在初始化两个子进程,一个用于ls -l,另一个用于sort.那些proccesses独立运行,我正在尝试重定向ls -l的输出,作为通过管道排序的输入.这个概念是主程序应该等待它们都终止.但是,等待似乎对ls -l工作正常,但它会挂起 - 永远不会终止排序.所以整个程序都挂起了.如果我从程序中删除了两个等待代码行,那么ls -l - > sort管道工作正常,当然主要终止在它们之前.我怀疑这是因为即使在ls -l终止之后,sort仍在等待输入.我不喜欢 了解父母的终止如何影响两个子进程的终止.请问有什么人可以向我解释一下究竟会发生什么?非常感谢你.PS.我忽略了大多数错误检查的清晰度和更少的代码.

Jon*_*ler 5

sort不能终止,因为父进程仍具有管开放的写入结束(和读出结束),所以sort还没有达到对管道EOF,所以它并没有得到所有的数据,因此它可以"写任何输出.

加:

close(pipeId[0]);
close(pipeID[1]);
Run Code Online (Sandbox Code Playgroud)

在调用runLS()runSORT()和事情按预期工作之后.

理想情况下,孩子们应该在重复后关闭管道的两端.如果你复制一个管道的文件描述符到标准文件流,你应该总是关闭这两个管道的末端.在这段代码中,你没有这样做就逃之遥追; 情况并非总是如此.

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