假设我编译并运行fork()的教科书示例。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid == -1)
return 1;
if (pid == 0)
puts("From child process.");
else
puts("From parent process.");
return 0;
}
if (pid == 0)
语句的两个分支的代码是否都在fork()
?换句话说,子进程是否包含对于永远不会被它执行的父代码,反之亦然?或者编译器是否可以对此进行优化?
答案 0 :(得分:7)
fork()
重复整个过程。唯一的区别在于fork()
调用本身的返回值 - 在父级中返回子级的PID,在子级中返回0
。
大多数操作系统使用称为 copy on write 的技术对此进行优化。孩子不是复制所有内存,而是共享父母的记忆。但是,所有内存页都标记为copy-on-write,这意味着如果任一进程修改了页面中的某些内容,那么它将在那时被复制,修改它的进程将被更改为使用副本(和COW)也将关闭原始页面的标志。)
有关详细信息,请参阅Wikipedia。