【发布时间】:2021-01-30 22:02:18
【问题描述】:
我一直在尝试使用管道来传递在子进程中计算的值(由父进程中的 execve 创建),但一直无法弄清楚为什么没有传输数据。我的理解是,除非在管道上设置了 close on exec 标志,否则即使子进程是使用具有新堆栈、堆等的数据副本创建的,管道仍将在进程之间共享?
父进程的工作方式是允许用户输入一个值来更改字符串,并且在子进程中完成字符串重新分配以发送回父进程。
这是我的父进程代码:
if((pid = fork())) {
if(pid < 0) {
printf("Fork error: %s\n",strerror(errno));
}
wait(&status);
} else {
int fd[2];
pipe(fd);
char* argv[] = {"new string", variableToChange, NULL};
ret = execve("newstringchildprocess", argv, environ);
close(fd[1]);
int nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
close(fd[0]);
}
和子进程(单独的C文件):
int fd[2];
pipe(fd);
char readbuffer[100];
close(fd[0]);
printf("Enter new string: ");
write(fd[1], variableToChange, (strlen(variableToChange) + 1));
int charCount = sizeof argv[0];
variableToChange = (char*) malloc(charCount);
close(fd[1]);
wait(NULL);
exit(EXIT_SUCCESS);
目前,如果我从两个文件中删除管道代码,我只会从子进程中获得输出。任何帮助都会很棒
【问题讨论】:
-
你在
fork之后调用pipe。 -
除了错误处理之外,
exec*之后没有任何代码。exec*除非失败,否则不会返回。