为什么我的第二个子进程在第一个子进程之前被命中?

时间:2018-10-17 21:32:04

标签: c shell command pipe

当前,我正在尝试编写一个支持管道的小外壳。在我的函数execute(char** args, char** args2)中,它需要两个char数组,其中每个命令都由定界符" "分割。第一个参数包含管道前面的命令(例如{ls, -l},第二个参数包含管道后面的命令(例如{wc})。

但是,在我的execute函数中,第二个子进程pid2首先运行,而第一个子pid1从未被命中。

我不确定是否缺少在C中创建自己的管道命令所必需的任何内容,并且会非常感谢我能获得的任何帮助/建议。

执行功能:

int execute(char** args, char** args2) {
    int des_p[2];
    pid_t pid1, pid2; 
    if(pipe(des_p) == -1) {
        perror("Pipe failed");
        exit(1);
    }
    pid1 = fork();
    if(pid1 == 0) {
        printf("AT FIRST CHILD");
        dup2(des_p[1], STDOUT_FILENO);
        close(des_p[0]);
        execvp(args[0], args);
        perror("execvp of of FIRST PROCESS failed");
        exit(1);
    }
    pid2 = fork();
    if(pid2 == 0) {
        printf("AT SECOND CHILD \n");
        dup2(des_p[0], STDIN_FILENO);
        close(des_p[1]);
        execvp(args2[0], args2);
        perror("execvp of SECOND PROCESS failed");
        exit(1);
    }
    close(des_p[0]);
    close(des_p[1]);
    wait(pid1);
    wait(pid2);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

第一个孩子正在运行,但是由于stdio缓冲,您没有看到该消息。默认情况下,stdout是行缓冲的,因此在您打印换行符之前不会刷新缓冲区。您要打印一条没有换行符的消息,然后在刷新缓冲区之前调用execvp(),因此永远不会刷新缓冲区,也永远不会看到消息。

将其更改为:

    printf("AT FIRST CHILD\n");