(´・ω・`)给自己的小小提醒:刚才看了一个大大写的关于fork的博文超级棒 加收藏了,要记得看啊
----------------------------------------------------------------------------------------------------------------------------------
首先来看三个系统调用:
sys_fork
sys_clone
sys_vfork
第一个先复制pcb再复制进程实体(写时拷贝),父子进程执行顺序不确定
第二个用来做线程(内核级线程),
第三个只复制pcb没有复制进程实体,避免调用exec产生无用功,在调用exec前与父进程共享数据(也就是共享地址空间),子进程先运行父进程阻塞,直到子进程执行exec或exit(但是现在fork功能升级啦所以vfork的作用大打折扣)。
以上三个系统调用最终都是通过do_fork实现的。
好啦,说了这么多废话终于讲到重点了,咳咳。
首先,打开我们的source insight,进入fork.c找到我们的do_fork()。
--------------------------------------------------------
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
--------------------------------------------------------
原来神秘的do_fork()长这个样子,,首先看参数:
--------------------------------------------------------
clone_flags与clone的flag参数相同
stack_start与clone的child_stack相同
regs指向通用寄存器的值。是在从用户态切换到内核态时被保存到内核态栈中的。
stack_size未使用时为0
parents_tidptr,child_tidptr-clone中对应参数ptid,ctid相同
--------------------------------------------------------
以上内容复制自fork.c
由于do_fork涉及的内容很多,这里就简略的说说他的大致过程
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------