fork vfork clone


vfork  共享内存描述符和所有的页表。fork除指定SIGCHLD信号以及所有清0的clone标志。


fork clone 都是c语言定义的一直封装函数,只有do_fork 才是内核态函数。

do_fork  copy_process 执行流程和调用关系总结。


do_fork->copy_process->


核心代码

static struct task_struct *copy_process(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *child_tidptr,
struct pid *pid,
int trace)
{

。。。。。。  以下函数需要在设置相应的CLONE_*标志才会被执行。

if ((retval = audit_alloc(p)))
goto bad_fork_cleanup_policy;
/* copy all the process information */
if ((retval = copy_semundo(clone_flags, p)))
goto bad_fork_cleanup_audit;
if ((retval = copy_files(clone_flags, p)))
goto bad_fork_cleanup_semundo;
if ((retval = copy_fs(clone_flags, p)))
goto bad_fork_cleanup_files;
if ((retval = copy_sighand(clone_flags, p)))
goto bad_fork_cleanup_fs;
if ((retval = copy_signal(clone_flags, p)))
goto bad_fork_cleanup_sighand;
if ((retval = copy_mm(clone_flags, p)))
goto bad_fork_cleanup_signal;
if ((retval = copy_namespaces(clone_flags, p)))
goto bad_fork_cleanup_mm;
if ((retval = copy_io(clone_flags, p)))
goto bad_fork_cleanup_namespaces;
retval = copy_thread(clone_flags, stack_start, stack_size, p, regs);
if (retval)
goto bad_fork_cleanup_io;


。。。。。。

}



系统调用代码:


2.6.32代码

int sys_fork(unsigned long p1, unsigned long p2, unsigned long p3,
    unsigned long p4, unsigned long p5, unsigned long p6,
    struct pt_regs *regs)
{
CHECK_FULL_REGS(regs);
return do_fork(SIGCHLD, regs->gpr[1], regs, 0, NULL, NULL);
}


int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
     unsigned long p4, unsigned long p5, unsigned long p6,
     struct pt_regs *regs)
{
CHECK_FULL_REGS(regs);
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gpr[1],
regs, 0, NULL, NULL);
}


int sys_clone(unsigned long clone_flags, unsigned long usp,
     int __user *parent_tidp, void __user *child_threadptr,
     int __user *child_tidp, int p6,
     struct pt_regs *regs)
{
CHECK_FULL_REGS(regs);
if (usp == 0)
usp = regs->gpr[1];/* stack pointer for child */
#ifdef CONFIG_PPC64
if (test_thread_flag(TIF_32BIT)) {
parent_tidp = TRUNC_PTR(parent_tidp);
child_tidp = TRUNC_PTR(child_tidp);
}
#endif
  return do_fork(clone_flags, usp, regs, 0, parent_tidp, child_tidp);
}


参考资料:

http://blog.sina.com.cn/s/blog_6abf2c040101fpcb.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值