我有一个程序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 回答
您正在将错误的数据传递给子进程 .
我假设
var_a
和var_b
是你要发送给程序A的字符串 . 它们都是 array of chars 类型,在C中是 same thing 作为 pointer to char (实际上指针和数组之间存在细微差别,但这与此问题无关) . 所以它们实际上只是指向每个参数的第一个字节的指针 .sendarray
,但是 array of char-pointers , same thing 为 pointer to char-pointer . 请记住这一点 .当调用
write()
时,第二个参数告诉它数据在内存中的位置 . 通过传递sendarray
,写入认为这个sendarray
指向您要写入的数据,尽管它实际指向另一个指针 . 那么会发生什么是var_a
和var_b
(这是sendarray
指向的)的指针值被写入管道 .因此,您必须将
var_a
和var_b
传递给write()
,因为它们是指向您要发送的实际数据的指针 . 此外,您还必须知道此数据的长度(多少字节) . 如果var_a
和var_b
指向以空值终止的字符串,则可以使用strlen()
来确定其长度 .最后一件事:我不知道你的程序A如何从连续的字节流中获得2个参数,如
stdin
,但假设它逐行读取它,你显然必须从程序B发送一个换行符,以及 .所以把你的写语句放在一起应该是这样的:
当然,如果我做出的任何假设都是错误的,那么你必须适当地采用这个代码 .