c - 父进程和子进程之间共享指针

标签 c linux pointers process fork

我在 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/

相关文章:

c - 在 C 中反转数组?

python - 外部命令 C 和 Python

c++ - 在 PROGMEM (Arduino) 中创建链表

java - 复制(不浅也不深)C/C++/Java 等效结构。复制到变量,该变量指向所有成员完全相同的内存

linux - ext4被认为是文件存储还是 block 存储?

c++ - Travis CI 中奇怪的编译器错误不会发生在本地机器上

c - C 标准库结构在 macOS 或 Linux 上的编译器和库版本之间是否兼容?

c - 奇怪的未知 malloc 错误

c - 理解C语言编程的数据结构

c - 函数没有及时释放