如何解决尝试将数据从 execve 子进程传递到 C 中的父进程
我一直在尝试使用管道来传递在子进程中计算的值(由父进程中的 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);
目前,如果我从两个文件中删除管道代码,我只会从子进程获得输出。任何帮助都会很棒
解决方法
如果我理解正确的话,您需要的是将您孩子的输出连接到父亲。
当然,这样做的一种方法是管道,但是您必须在父进程中创建管道然后分叉,因此子进程将继承打开的管道。
哦,如果我没记错的话,在 execve
之后进程“死亡”,因为它不会返回到您的代码。
int fd[2];
pipe(fd);
if((pid = fork()) < 0) {
printf("Fork error: %s\n",strerror(errno));
} else if (pi==0) { //Child process
char* argv[] = {"new string",variableToChange,NULL};
dup2(fd[1],1); //You connect to the pipe in input mode
execve("newstringchildprocess",argv,environ);
printf("Shouldn't execute this\n");
exit(1);
} else{ //Father process
int nbytes = read(fd[0],readbuffer,sizeof(readbuffer));
printf("Received string: %s",readbuffer);
close(fd[0]);
close(fd[1]);
}
另一个c文件只需要关注其逻辑而不是通信:
printf("Enter new string: ");
printf(variableToChange,(strlen(variableToChange) + 1));
int charCount = sizeof argv[0];
variableToChange = (char*) malloc(charCount);
wait(NULL);
exit(EXIT_SUCCESS);
编辑
无论如何,您可以在 dup2
中替换您想要使用的文件描述符,而不是直接连接到标准输出,它可以连接到另一个 fd 中的管道。这有点难,但为您提供了更多的灵活性。请记住,另一个 .c 文件中创建的另一个管道与父管道不同。
int fd[2];
pipe(fd);
if((pid = fork()) < 0) {
printf("Fork error: %s\n",NULL};
execve("newstringchildprocess",readbuffer);
close(fd[0]);
close(fd[1]);
}
另一个c文件只需要关注其逻辑而不是通信:
printf("Enter new string: ");
write(4,(strlen(variableToChange) + 1)); // I put 4 as I assume it is where the input of the pipe is,as i think you can't access fd[1] form this file
int charCount = sizeof argv[0];
variableToChange = (char*) malloc(charCount);
wait(NULL);
exit(EXIT_SUCCESS);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。