当fork()系统调用时,父子进程的变量指向同一个地址

问题描述 投票:0回答:1

我设置了一个全局变量

n=2
,然后我使用
fork()
创建了一个子进程,然后我修改了父子进程中n的值并打印,子进程中的
--n
和父进程中的
++n
处理。然后
print()
他们,然后我得到
2 1 3
输出。但我继续在父子进程中打印
n
的地址,发现它们指向同一个地址。

我知道现代linux采用

Copy on Write
策略,只有当进程尝试修改内存时,操作系统才会为修改的内存页分配新的物理内存,并将修改的内容写入其中。原始内存页仍然保留给其他进程。所以我的问题是为什么两个n都指向同一个地址?

这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>

volatile int n=2;

int main() {
    pid_t pid;
    
    printf("%d\n",n);

    pid = fork();
    if (pid < 0) {
        perror("Fork failed");
        exit(1);
    } else if (pid == 0) {
        --n;
        printf("%p\n",&n);
        printf("%d\n",n);
        exit(0);
    } else {
        wait(NULL);     
        ++n;
        printf("%p\n",&n);
        printf("%d\n",n);
    }

    return 0;
}

输出是

2
0x55af5a07e010
1
0x55af5a07e010
3
c operating-system fork
1个回答
0
投票

在具有虚拟内存的系统中,每个进程都有自己的地址空间。它们具有相同地址的事实并不意味着它们位于同一位置,因为它们在不同进程的地址空间中位于相同地址。

© www.soinside.com 2019 - 2024. All rights reserved.