将system()的stdout管道传输到其他system()的stdin

时间:2019-04-12 20:18:55

标签: c linux pipe system-calls stdio

我想学习如何在C语言中使用管道,并尝试做一些基本的事情,例如在外壳中克隆|的行为。

这是我的第一次尝试:

#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>


int main(void)
{
    FILE    *stdin_tmp;

    stdin_tmp   = stdin;
    stdin       = stdout;
    system("cat /tmp/test.txt");
    system("less");
    stdin       = stdin_tmp;

    return  0;
}

这就是我要做的(用shell编写):

cat /tmp/test.txt |less

该行为显然不是我所期望的。 less未收到cat的输出。

如何正确完成?

1 个答案:

答案 0 :(得分:1)

尝试使用popen()函数。

这是它的原型:

FILE *popen(const char *command, const char *type);

这是使用它的正确方法:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int ch;
    FILE *input;
    FILE *output;

    input = popen("cat /tmp/test.txt", "r");
    output = popen("less", "w");
    if (!input || !output)
        return EXIT_FAILURE;
    while( (ch = fgetc(input)) != EOF )
        fputc(ch, output);
    pclose(input);
    pclose(output);

    return 0;
}