jpa*_*jpa 22
在整个过程中,整个内存都是重复的.
实际上,它使用"写入时复制"系统.第一次进程在fork()之后更改其内存时,会对已修改的页面(通常为4kB)进行单独的复制.
通常,流程的代码段不会被修改,在这种情况下,它仍然是共享的.
Mar*_*tos 17
从逻辑上讲,fork会创建原始进程的相同副本,该副本在很大程度上独立于原始进程.出于性能原因,内存与copy-on-write语义共享,这意味着未修改的内存(如代码)仍然是共享的.
文件描述符是重复的,因此分叉进程原则上可以代表父进程接管数据库连接(或者如果程序员有点扭曲,它们甚至可以与数据库联合通信).更常见的是,这用于在进程之间设置管道,以便您可以编写find -name '*.c' | xargs grep fork.
一堆其他的东西是共享的.详情请见此处.
一个重要的遗漏是线程 - 子进程只继承调用的线程fork().这导致多线程程序中没有问题,因为锁定在父级中的互斥锁等的状态是特定于实现的(并且不要忘记malloc()并在printf()内部使用锁).fork()返回后孩子唯一安全的做法就是尽快打电话execve(),即使这样你也必须对文件描述符保持谨慎.见这里的完整的恐怖故事.
编辑:错别字HTH