c - Linux Fork 进程终止

标签 c linux shell pipe fork

//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 一直等待输入, 即使在 ls - l 终止之后。我不明白如何终止 父进程影响两个子进程的终止。 有人愿意向我解释一下到底发生了什么吗? 非常感谢。附:为了清晰起见和减少代码,我忽略了大多数错误检查。

最佳答案

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

添加:

close(pipeId[0]);
close(pipeID[1]);

调用 runLS()runSORT() 后,事情按预期工作。

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

我个人认为这两个全局变量没有多大帮助。例如,标记为 pipeIn 的管道是 sort 的输入,但也是 ls 的输出。

关于c - Linux Fork 进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116467/

相关文章:

c - 如何使用 C 在 Windows 中的文件上安装只读锁

c - 操作中的宏结果故障

linux - 在 Debian 系统上安装 Debian 软件包时如何读取输入

Linux IPV6 主地址和辅助地址

mysql - 从 shell 脚本将值插入到 mysql

Bash:使用第 n 行作为命令行的一部分

Java 次要/更新版本检查

c - 如何使用 ARM Cortex A9 中的 SWI 来使能 IRQ 中断?

Python搜索替换为多个Json对象

c - 深不可测的C结构