在下面给出的程序中,两个进程的虚拟地址是相同的。我理解全局变量的原因,但无法理解局部变量。
运行前如何将虚拟地址分配给局部变量?
int main()
{
int a;
if (fork() == 0)
{
a = a + 5;
printf(“%d,%d\n”, a, &a);
}
else
{
a = a –5;
printf(“%d, %d\n”, a, &a);
}
}
虚拟地址是……虚拟的。这意味着来自两个不同进程(如父进程及其子进程)的相同虚拟地址指向两个不同的物理地址。
编译时,编译器决定将堆栈或寄存器用于局部变量。在这种情况下,堆栈。
它还决定在(虚拟)地址空间中放置堆栈的位置。
因此,对于这两个进程,堆栈都从相同的(虚拟)地址开始。由于这个特定程序的流程是相当确定的,因此两个进程的堆栈帧看起来完全相同,从而导致“a”在堆栈中的偏移量相同。
无论a
fork之前的地址是什么,fork之后肯定是一样的,所以在两个进程中必然是一样的,因为它们的地址a
都是相同的。在大多数实现中,a
通过将偏移量(由编译器确定)添加到堆栈指针的内容来获得的地址。堆栈指针的内容被 fork 复制。