execlp在c中重定向stdin

时间:2014-03-07 08:39:02

标签: c redirect io

问题很简单

我已经四处寻找,但我找不到解决方案

char *data1;
char *data2;
pid_t pid = fork();
int stat;

if (pid == 0){
    execlp("Program B");
} else {
    wait(&stat);
    if (WIFEXITED(stat))
        printf("%d\n", WEXITSTATUS(stat));
}

问题是我需要将data1data2作为stdin发送给程序B

但我找不到解决方案

我该如何处理?

3 个答案:

答案 0 :(得分:1)

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

int main(void)
{
    char *data1 = "First message.\n";
    char *data2 = "What the rest of the world has been waiting for.\n";
    pid_t pid;
    int p[2];
    if (pipe(p) < 0)
        perror("pipe() failed");
    else if ((pid = fork()) < 0)
        perror("fork() failed");
    else if (pid == 0)
    {
        dup2(p[0], STDIN_FILENO);
        close(p[0]);
        close(p[1]);
        execlp("cat", "cat", (char *)0);
        perror("execlp() failed");
    }
    else
    {
        close(p[0]);
        write(p[1], data1, strlen(data1));
        write(p[1], data2, strlen(data2));
        close(p[1]);
        int status;
        int corpse = wait(&status);
        if (WIFEXITED(status))
            printf("%d exited with status %d\n", corpse, WEXITSTATUS(status));
    }
    return 0;
}

注意需要关闭多少次。

答案 1 :(得分:0)

您可以将数据作为参数列表提供给新流程。

语法: - int execlp(const char *path, const char *arg0, ..., NULL);

所以你的电话看起来像这样

// convert the input data into string format i.e data1 and data2 should be strings 
execlp("Program B","Program B",data1,data2,NULL); 

在程序B中使用适当的方法将其转换为您想要的任何类型。

答案 2 :(得分:0)

构建管道到stdin是可行的方法,

char *data1;
char *data2;
int stat;
pid_t pid;

if( pipe(pfd) < 0 ) {
perror("pipe");
return 1;
}

pid = fork();

if (pid == 0)
{
    // Close the writing end of the pipe
    close(pfd[1]);
    execlp("Program B");
} 
else if(pid==-1) 
{
    perror("fork");
}
else    
{
    // Write to the pipe.
    if (write(pfd[1], "This is my data \n", 16) != 16)
        perror("write");

    close(pfd[1]);

    wait(&stat);
    if (WIFEXITED(stat))
    printf("%d\n", WEXITSTATUS(stat));
}