我在Linux上使用主进程中的函数Fork()创建了一个C程序来创建另一个子进程。
我的目标是在主进程中创建一个指针(int *)并在子进程内更改它,并在子进程被终止后返回主进程并显示指针的值(int *)。
这是我的计划的样子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main (){
int i, *x, f;
*x = 0;
printf("address from father: %p pid: %d\n", x, getpid());
f = fork();
if (f==0) {
*x = 5;//change the value of the pointer inside the child
printf("address from son: %p ppid: %d\n", x, getppid());
exit(0);
}
wait(NULL);
printf("x = %d\n", *x);
exit (0);
}
链接:http://openensak.com/img/code.png
这就是程序显示的内容:
address from father: 0x7fff9b698340 pid: 4372
address from son: 0x7fff9b698340 ppid: 4372
x = 0
链接:http://openensak.com/img/display.png
现在的问题是,即使子内部和外部的指针共享相同的内存地址(0x7fff9b698340),指针的值也不会改变。
谢谢。##标题##
答案 0 :(得分:2)
管道不直接访问内存,渲染指针无用。
共享内存可以通过指针使用 - 但是两个进程之间所需的指针可能不同,具体取决于共享内存块被映射到地址空间的位置。
就像房子里的窗户可以处于不同的内部(楼层)相对高度,而不是外部(地面) - 除非,正如Duck所说,该块是在前叉分配的,因此已映射到进程内存中
也许结论是,在具有流程内存管理和现代操作系统的现代操作系统中。虚拟内存,指针主要在进程内有意义且可共享(例如,在线程之间)。我会对依赖对进程之间的指针通用性犹豫不决。
答案 1 :(得分:0)
fork()产生一个全新的过程---你不能修改另一个过程中的变量。
您需要使用管道: http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html