在父进程和子进程之间共享指针

时间:2013-12-07 00:20:14

标签: c linux pointers process fork

我在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),指针的值也不会改变。

谢谢。##标题##

2 个答案:

答案 0 :(得分:2)

管道不直接访问内存,渲染指针无用。

共享内存可以通过指针使用 - 但是两个进程之间所需的指针可能不同,具体取决于共享内存块被映射到地址空间的位置。

就像房子里的窗户可以处于不同的内部(楼层)相对高度,而不是外部(地面) - 除非,正如Duck所说,该块是在前叉分配的,因此已映射到进程内存中

也许结论是,在具有流程内存管理和现代操作系统的现代操作系统中。虚拟内存,指针主要在进程内有意义且可共享(例如,在线程之间)。我会对依赖对进程之间的指针通用性犹豫不决。

答案 1 :(得分:0)

fork()产生一个全新的过程---你不能修改另一个过程中的变量。

您需要使用管道: http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html