#include <stdio.h>
#include <unistd.h>
int main() {
int x = 0;
pid_t pid = fork();
if(pid == 0) {
//adding one to X when it is child process
x++;
}
printf("current X: %d, address of X: %p, process : %d\n", x, &x, pid);
}
结果是: result
所以我对 Unix 很陌生,对 fork() 不太熟悉。如果子进程将复制父进程,以便它具有不同的地址空间。那么,为什么这里两个进程上的X具有相同的地址但不同的值呢?
最佳答案
这就是 fork 的工作原理。它创建地址空间的副本,实际上它进行了一些优化(仅需要写入更改的页面)。
副本使用相同的地址:
这是可能的,因为父进程和子进程只能看到自己的版本
这是必需的:如果您有任何链接的数据结构,从一个对象到另一个对象的指针必须保持有效。如果复制的地址空间将占用不同的地址,则所有指针都必须固定 - 并且操作系统甚至不知道哪些字节是指针,哪些只是数据。
关于c - 在子进程和父进程中,变量具有相同的地址但具有不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52436180/