【发布时间】:2013-03-09 20:20:46
【问题描述】:
我知道fork() 函数创建了一个与其父进程相同的进程,只是它的 PID 不同。它们最初具有相同的变量,对这些变量所做的更改不会相互影响。但是当一个全局指针变量被共享时会发生什么?
我已经编写了一些代码并打印了结果。似乎父进程和子进程都有指向相同内存位置的指针,但是对这些内存位置所做的更改,即父进程中的*p = 1和子进程中的*p = 2,不会影响彼此。另请注意,我将父进程设为wait(NULL),直到子进程退出。所以子进程改变了与父进程指针内存地址相同的指针所指向的值。
我知道当fork() 被调用时,父进程会克隆所有内容:寄存器、程序计数器等。但这怎么可能呢?子进程退出后,父进程的变量值不应该改变吗?是不是因为系统把所有的东西(包括父进程的指针变量)都放到了栈上,当子进程终止时弹出?
【问题讨论】:
-
每个进程都有自己的虚拟内存映射——地址是“假装”的。
-
阅读一些关于 Unix 或 Linux 编程的好书,例如 advancedlinuxprogramming.com 并了解更多关于 en.wikipedia.org/wiki/Virtual_memory 和例如
mmap(2)、fork(2)和execve(2)系统调用。 -
"我知道什么时候调用 fork(),进程共享所有内容,注册程序计数器等。" --- 当心,你知道一些不真实的事情。
-
“它(fork)创建了原始进程的完全相同的副本,包括所有文件描述符、寄存器——一切。” Andrew Tannenbaum - 操作系统设计和实现。通过“分享”,我实际上试图表示克隆,如果这就是你所说的,我知道一些不正确的事情。它们不“共享”,它们被“克隆”到子处理器。这就是我的意思。
-
@Volkanİlbeyli 对。这是一个副本。它没有共享。
标签: c linux pointers global-variables fork