繁体   English   中英

Linux Fork进程终止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM