首页 文章

使用dup2和pipe重定向stdin

提问于
浏览
0

我有一个程序A,它从stdin获取两个参数,并根据参数使用唯一代码退出 . 我正在编写一个程序B,它使用fork和exec调用程序A,让程序B打印出代码程序A退出 . 出于某种原因,程序A似乎没有在fork的子进程中获取我传递给它的数据 . 我不确定我是否将正确的数据传递给子进程 .

有人可以帮帮我吗?谢谢!

这是我的代码:

int program_B(void) {
char var_a[256];
char var_b[256];
int fd[2];

 // Read from stdin 
char *sendarray[2];
sendarray[0] = var_a;
sendarray[1] = var_b;


if(fgets(var_a, MAXLINE, stdin) == NULL) {
    perror("fgets");
    exit(1);
}

if(fgets(var_b, MAXLINE, stdin) == NULL) {
    perror("fgets");
    exit(1);
}

if (pipe(fd) == -1) {
  perror("pipe");
  exit(1);
}

int pid = fork();

// Child process -- error seems to be here. 
if (pid == 0) {

    close(fd[1]);

    dup2(fd[0], fileno(stdin));

    close(fd[0]);

    execl("program_A", NULL);

    perror("exec"); 
    exit(1);

} else {

    close(fd[0]);
    write(fd[1], sendarray, 2*sizeof(char*));
    close (fd[1]);

    int status; 

      if (wait(&status) != -1) {

        if (WIFEXITED(status)) {


            printf("%d\n", WEXITSTATUS(status));


        } else {
          perror("wait");
          exit(1);
        }
      }


}







return 0;
}

1 回答

  • 1

    您正在将错误的数据传递给子进程 .

    我假设 var_avar_b 是你要发送给程序A的字符串 . 它们都是 array of chars 类型,在C中是 same thing 作为 pointer to char (实际上指针和数组之间存在细微差别,但这与此问题无关) . 所以它们实际上只是指向每个参数的第一个字节的指针 . sendarray ,但是 array of char-pointerssame thingpointer to char-pointer . 请记住这一点 .

    当调用 write() 时,第二个参数告诉它数据在内存中的位置 . 通过传递 sendarray ,写入认为这个 sendarray 指向您要写入的数据,尽管它实际指向另一个指针 . 那么会发生什么是 var_avar_b (这是 sendarray 指向的)的指针值被写入管道 .

    因此,您必须将 var_avar_b 传递给 write() ,因为它们是指向您要发送的实际数据的指针 . 此外,您还必须知道此数据的长度(多少字节) . 如果 var_avar_b 指向以空值终止的字符串,则可以使用 strlen() 来确定其长度 .

    最后一件事:我不知道你的程序A如何从连续的字节流中获得2个参数,如 stdin ,但假设它逐行读取它,你显然必须从程序B发送一个换行符,以及 .

    所以把你的写语句放在一起应该是这样的:

    write(fd[1], var_a, strlen(var_a));
    write(fd[1], "\n", 1);
    write(fd[1], var_b, strlen(var_b));
    

    当然,如果我做出的任何假设都是错误的,那么你必须适当地采用这个代码 .

相关问题