fork
fork被调用时,复制父进程的页表,创建新的进程描述符task_struct,新创建的进程与父进程对地址空间的关系为 “写时复制” 当进程写数据到地址空间时就重新开辟一块内存来存放新结果。fork的进程一般之后会电泳exec,exec复制读取可执行文件并将其载入地址空间,exec执行完后子进程的地址空间将不再和父进程一样。
vfork
在过去,fork还不是写时复制。而如今,vfork与fork的区别仅仅是不复制页表。 vfork调用后,父进程挂起,子进程仿佛一个线程般共用父进程的地址空间,子进程无法写入,直到子进程退出程序或者执行exec,父进程才能继续运行。
关系
fork,vfork,__clone都调用clone,也就是说,在现代操作系统,fork是clone实现的,它们各具各自需要的参数标志调用clone,clone又调用do_fork(),do_fork()又调用copy_create(),copy_create()会调用函数来为新进程分配内核栈,task_struct(进程描述符),新的PID,然后根据clone的标志执行相应的工作,如是否共享地址空间,是否共享打开的文件