我在 Linux 上创建了一个 C 程序,使用主进程中的 Fork() 函数来创建另一个子进程。
我的目标是在主进程中创建一个指针(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),指针的值也不会改变。
谢谢。## 标题 ##
最佳答案
管道不直接访问内存,因此指针毫无用处。
共享内存可以通过指针使用——但是两个进程之间所需的指针可能不同,具体取决于共享内存块映射到地址空间的位置。
就像房子里的 window 一样,从内部(地板水平)到外部(地面水平)的相对高度可以不同——除非,正如 Duck 所说,该 block 是在 fork 前分配的,因此已经映射到进程内存中.
也许结论是,在具有进程内存管理和虚拟内存的现代操作系统中,指针主要是有意义的并且可以在进程内共享(例如,在线程之间)。我对于依赖进程之间的指针通用性会犹豫不决。
关于c - 父进程和子进程之间共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435890/