我知道fork()
函数创建一个与其父进程相同的进程,仅其具有的 PID 不同。它们最初具有相同的变量,并且对这些变量所做的更改不会相互影响。但是当全局指针变量被共享时会发生什么呢?
我写了一些代码并打印出了结果。看起来父进程和子进程都有指向same内存位置,但是对这些内存位置进行的更改,即*p = 1
在父母和*p = 2
孩子之间,互不影响。另请注意,我创建了父进程wait(NULL)
直到子进程退出。因此,子进程更改了与父进程指针具有相同内存地址的指针所指向的值。
我知道什么时候fork()
被调用时,父进程克隆所有内容:寄存器、程序计数器等。但这怎么可能呢?子进程退出后,父进程的变量值不应该改变吗?是否是因为系统将所有内容(包括父进程的指针变量)放入堆栈并在子进程终止时弹出它们?
当一个进程被分叉时,新进程是为了所有(?)意图和目的copy原创的,有自己的虚拟地址空间 http://en.wikipedia.org/wiki/Virtual_memory、文件描述符等从相当简单的角度来看,相同的内存地址实际上会指向每个进程的不同物理内存地址 - 您可以有两个指向完全不同数据的相等指针。
当然,在现代操作系统中事情并不那么简单。fork()
,例如,实际上并不copy一切都会浪费处理器时间和内存。内核使用了一些页表 http://en.wikipedia.org/wiki/Page_table操纵来实施写时复制 http://en.wikipedia.org/wiki/Copy-on-write内存复制。此外,出于性能和正确性的原因,可以在某种程度上控制哪些资源将实际克隆到子进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)