#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具有相同的地址却具有不同的值?
答案 0 :(得分:3)
那是fork的工作方式。它复制了地址空间,实际上进行了一些优化(只需要写入更改的页面)。
副本使用相同的地址:
这是可能,因为父进程和子进程只会看到其版本
,它是必需的:如果您有任何链接的数据结构,则从一个对象到另一个对象的指针必须保持有效。如果复制的地址空间占用不同的地址,则所有指针都必须固定-操作系统甚至不知道哪个字节是指针,哪些字节只是数据。
答案 1 :(得分:1)
从叉子上的wiki:
fork操作为子代创建一个单独的地址空间。 子进程具有父进程所有内存段的精确副本。在遵循SunOS-4.0虚拟内存模型的现代UNIX变体中,实现了写时复制语义和物理内存不需要实际复制。 相反,两个进程中的虚拟内存页面可能会引用物理内存的相同页面,直到其中一个写入该页面为止:然后将其复制。这种优化在通常情况下使用fork是很重要的。与exec结合使用以执行新程序:通常,子进程在停止执行其程序以支持要启动的程序之前仅执行一小部分操作,并且需要很少的(如果有的话)父母的数据结构。