Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux Fork进程终止_C_Linux_Shell_Pipe_Fork - Fatal编程技术网

C Linux Fork进程终止

C Linux Fork进程终止,c,linux,shell,pipe,fork,C,Linux,Shell,Pipe,Fork,你好!!我很难在linux上使用一些简单的管道。 我试图模拟shell命令ls-l | sort。 如你所见,我正在初始化两个子进程, 一个用于ls-l,另一个用于排序。 这些进程独立运行,我正在尝试重定向输出 作为通过管道进行排序的输入。其概念是,主程序 应该等待它们两个都终止。然而,等待似乎有效 ls-l很好,但它挂起-从不终止排序。所以整个计划 挂起。如果我从程序中删除两行等待代码,ls-l->sort 管道工作良好,当然,干管在它们前面终止。 我怀疑这是因为sort一直在等待输入, 即使

你好!!我很难在linux上使用一些简单的管道。 我试图模拟shell命令ls-l | sort。 如你所见,我正在初始化两个子进程, 一个用于ls-l,另一个用于排序。 这些进程独立运行,我正在尝试重定向输出 作为通过管道进行排序的输入。其概念是,主程序 应该等待它们两个都终止。然而,等待似乎有效 ls-l很好,但它挂起-从不终止排序。所以整个计划 挂起。如果我从程序中删除两行等待代码,ls-l->sort 管道工作良好,当然,干管在它们前面终止。 我怀疑这是因为sort一直在等待输入, 即使在ls-l终止之后。我不明白终止合同是怎么回事 父进程影响两个子进程的终止。 请任何人向我解释一下实际发生的情况好吗?
非常感谢你。另外,我忽略了大多数错误检查,以确保清晰性和更少的代码。

排序无法终止,因为父进程仍然打开管道的写入端(和读取端),因此排序没有达到管道上的EOF,因此它没有获得所有数据,因此无法写入任何输出

加:

在调用
runLS()
runSORT()
之后,一切正常

理想情况下,孩子们应该在复制完管道后关闭管道的两端。如果将管道文件描述符复制到标准文件流,则几乎应该始终关闭管道的两端。在这段代码中,你不用做就可以逃脱;情况并非总是如此


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

感谢您的支持,您的方法确实有效。你能再解释一下你的答案吗[理想情况下是这样]?在上面的代码中,我怎么可能关闭管道的末端?至于变量,实际上我几乎从来没有全局变量,这只是为了清楚起见,在
ls
子级中,有两个文件描述符打开,用于管道的写入端;一个是
*pipeOUT
中的值,另一个是
STDOUT\u FILENO
中的值。您确实不打算再次使用
*pipeOUT
描述符,因此现在应该关闭它。与
sort
子项中的
dup2()
类似。您还可以争辩说,父级不会使用管道的任何一端,因此它也应该基于这些理由关闭这些文件描述符。确保有足够的关闭调用通常是让基于管道的程序工作的技巧。至于如何关闭它:
close(*pipeOUT)
close(*pipeIN)
。事实上,为了对称,您需要执行
dup2()
,然后在每个子对象中关闭这两个。
dup2()
调用稍有不同,但结尾是一样的。在根据您的答案进行更多的研究之后,我想我现在完全理解了文件描述符、dup和管道的工作原理。非常感谢,祝你度过美好的一天:)
//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");
}
close(pipeId[0]);
close(pipeID[1]);