Linux笔记记录2 do_fork

来源:互联网 发布:网络优化工程师好学不 编辑:程序博客网 时间:2024/06/06 07:45

(´・ω・`)给自己的小小提醒:刚才看了一个大大写的关于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涉及的内容很多,这里就简略的说说他的大致过程

----------------------------------------------------------------------------------------------------------------------------------------------


是的,,偷个懒 直接丢笔记截图 懒得打字


----------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------

原创粉丝点击