问题描述
我一直在尝试使用管道来传递在子进程中计算的值(由父进程中的 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],(strlen(variableToChange) + 1));
int charCount = sizeof argv[0];
variableToChange = (char*) malloc(charCount);
close(fd[1]);
wait(NULL);
exit(EXIT_SUCCESS);
目前,如果我从两个文件中删除管道代码,我只会从子进程获得输出。任何帮助都会很棒
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)