如何在多进程c程序中将stdout重定向回终端?

时间:2017-06-03 19:28:56

标签: c pipe

我正在尝试编写一个相当于linux命令ps -aux | sort -r -n -k 5的c程序,但我没有得到任何输出

这是我的代码

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char ** argv){
    int pipes[2];
    int r;
    r = pipe(pipes);
    if (r < 0) {
        fprintf(stderr, "pipe failed\n\n"); // stderr is a FILE* variable for the standard error file (terminal) 
        exit(2);
    }
    int saved_stdout = dup(1);
    int pid = fork();
    if(pid > 0){
        // Parent
        pid = fork();
        if(pid > 0){
            // Parent
            wait(NULL);
        }else if (pid == 0){
            // Child 1
        printf("Child 1\n");

        dup2(pipes[1], 1);
        close(pipes[0]);
        close(pipes[1]);


        execlp("/bin/ps", "ps", "-aux", (char*) NULL);
        exit(0);

        }else{
            fprintf(stderr, "FORK FAILED\n\n");
            return 1;
        }
    }else if (pid == 0){
        // Child 2
        printf("Child 2\n");
        dup2(pipes[0], 0);
        close(pipes[0]);
        close(pipes[1]);
        dup2(saved_stdout, 1);
        close(saved_stdout);
        execlp("/bin/sort", "sort", "-r", "-n", "-k", "5", (char*)NULL);
        exit(0);
    }else{
        fprintf(stderr, "FORK FAILED\n\n");
        return 1;
    }
    wait(NULL);
    printf("Exiting parent\n");
}

我得到的输出是

Child 1
Child 2
Exiting parent

我实际上并没有打印execlp命令,我尝试将stdout保存到变量saved_stdout,这是我在另一个答案中找到的解决方案,但似乎没有工作。

如何将stdout重定向回终端?

1 个答案:

答案 0 :(得分:3)

使用您的代码输出的输出结果是:

Child 1
Child 2

并且程序不会停止。或者您确定输出有效吗?

无论如何,你的问题是你不要在父母身上关闭管道。只需添加:

close(pipes[0]);
close(pipes[1]);

在你的父母双方(在你打电话给wait()之前)。

Plus saved_stdout在您的情况下无用,因为您只更改了child1中的stdout。 saved_stdout1描述了您孩子2中的同一文件。