C:通过exec将stdin重定向到外部程序

时间:2019-12-16 23:10:08

标签: c

我正在尝试执行一个外部程序(echo仅用于测试,但是仍然可以工作)。该程序接受第一个参数,然后将其提交给第二个参数,这需要通过STDIN进行。

如果您打印出管道内容而不是使用exec,则重定向到管道并因此重定向到STDIN的工作是完美的。

但是程序(echo)未返回任何内容,其行为保持不变。因此,STDIN不会被重定向,但是我不明白为什么。我缺少的exec系列中是否缺少参数?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("parameters do not match");
        exit(1);
    }

    // create two pipes
    int downstream[2];
    int upstream[2];
    pipe(downstream);
    pipe(upstream);

    // create child
    if (fork() == 0)
    {
        // close not required descriptors
        close(upstream[0]);
        close(downstream[1]);

        // close and duplicate stdin/stdout from pipe 
        dup2(downstream[0], STDIN_FILENO);
        dup2(upstream[1], STDOUT_FILENO);

        // exec
        // What to do here?
        char *args[] = {"echo", NULL};

        execvp(args[0], args);
        exit(0);
    }

    // close not required
    close(upstream[1]);
    close(downstream[0]);

    // send second argument to pipe
    write(downstream[1], argv[1], strlen(argv[1]));

    // read result from pipe
    char buffer[100];
    read(upstream[0], buffer, 100);
    printf("OUTPUT: %s", buffer);
    exit(0);
}

1 个答案:

答案 0 :(得分:1)

您可能希望修改数据的传递方式,以使其适用于以块为单位运行的程序,并期待EOF指示器。

一旦传送数据,主电源应关闭下游。这将允许许多在缓冲模式下工作的程序处理输入,即使输入未完成也是如此。还应该检查来自子级数据的错误/ EOF,并处理大块的输出。

建议的main

    ...
    close(upstream[1]);
    close(downstream[0]);

    // send second argument to pipe
    write(downstream[1], argv[1], strlen(argv[1]));
    close(downstream[1]) ;

    // read result from pipe
    char buffer[100];
    int nread ;
    // Lop until EOF or error.
    while ( (nread=read(upstream[0], buffer, sizeof(buffer)-1) > 0 ) {
        buffer[nread] = 0 ;       // NUL terminator.
        printf("OUTPUT: %s", buffer);
    } ;
    exit(0);