我有一个程序A,它从STDIN和退出两个参数,根据参数不同的唯一代码。我正在编写一个程序B,用叉和Excel调用程序A,让程序B打印出代码程序的一个出口。出于某种原因,程序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;
}

最佳答案

您正在将错误的数据管道传输到子进程。
我假设var_avar_b是要发送到程序A的字符串。它们都是char数组类型,在C中,这与指向char的指针是一样的(实际上指针和数组之间有一点不同,但这与此问题无关)。所以它们实际上只是指向每个参数的第一个字节的指针。sendarray是一个字符指针数组,它与指向字符指针的指针是一样的。记住这一点。
当调用write()时,第二个参数告诉它数据在内存中的位置。通过传递sendarray,write认为这个sendarray指向要写入的数据,尽管它实际上指向另一个指针。所以发生的是var_avar_b的指针值(这就是sendarray所指的)被写入管道。
因此必须将var_avar_b传递到write(),因为它们是指向要发送的实际数据的指针。此外,还必须知道这些数据有多长(多少字节)。如果var_avar_b指向以空结尾的字符串,则可以使用strlen()来确定它们的长度。
最后一件事:我不知道你的程序A是如何从一个连续的字节流(如stdin)中获得2个参数的,但是假设它逐行读取它,显然你也必须从程序B发送一个新的行字符。
因此,把所有这些放在一起,你的书面陈述应该是这样的:

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

当然,如果我所做的任何假设是错误的,您必须适当地采用此代码。

10-07 15:27