我有一个程序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_a
和var_b
是要发送到程序A的字符串。它们都是char数组类型,在C中,这与指向char的指针是一样的(实际上指针和数组之间有一点不同,但这与此问题无关)。所以它们实际上只是指向每个参数的第一个字节的指针。sendarray
是一个字符指针数组,它与指向字符指针的指针是一样的。记住这一点。
当调用write()
时,第二个参数告诉它数据在内存中的位置。通过传递sendarray
,write认为这个sendarray
指向要写入的数据,尽管它实际上指向另一个指针。所以发生的是var_a
和var_b
的指针值(这就是sendarray
所指的)被写入管道。
因此必须将var_a
和var_b
传递到write()
,因为它们是指向要发送的实际数据的指针。此外,还必须知道这些数据有多长(多少字节)。如果var_a
和var_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));
当然,如果我所做的任何假设是错误的,您必须适当地采用此代码。