c - 为什么我的第二个子进程在第一个子进程之前受到攻击?

标签 c shell command pipe

目前,我正在尝试编写一个支持管道的小 shell。在我的函数 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;
}

最佳答案

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

将其更改为:

    printf("AT FIRST CHILD\n");

关于c - 为什么我的第二个子进程在第一个子进程之前受到攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52863924/

相关文章:

php - 转义冗长的 Bash 命令以与 PHP exec() 一起使用

bash - bash 的字符串长度

c++ - 使用文件输入运行 C++ 的命令

wpf - 命令和命令参数的不同数据上下文

c - 理解 Linux 内核中的 container_of 宏

c++ - 关于将 std::less 和 std::greater 与 std::sort 一起使用的困惑

java - Java 中的字符流和字节流以及 C 中的 Char 与 Byte 有什么区别?

linux - 如果命令指定输出文件,如何使用管道

c - 通过图像名称获取进程的进程句柄

python - 如何在 Python 中只查找总 RAM