fork函数
fork函数从已经存在的进程中创建一个新的进程,新进程为子进程,原进程为父进程。子进程返回0,父进程返回子进程的pid。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
int ret = fork();
if(ret == 0)
{
printf("I am child : %d, ret: %d\n", getpid(), ret);
}
else if(ret > 0)
{
printf("I am father : %d, ret: %d\n", getpid(), ret);
}
else
{
perror("fork");
return 1;
}
return 0;
}
进程调用fork,当控制转移到内核中的fork代码后,内核:
- 分配新的内存块和内核数据结构给子进程
- 将父进程的部分数据结构内容拷贝至子进程
- 添加子进程到系统进程列表当中
- fork返回,开始调度器调度
写时拷贝
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。
写时拷贝是一种采取了惰性优化方法来避免复制时的系统开销,多个进程读取同一份数据,如果全部复制会造成浪费,所以每个进程只要保存一个指向这个资源的指针就可以了,如果一个进程要修改自己的那份资源,那么就会复制那份资源,并把复制的那份提供给进程。