【发布时间】:2011-05-08 14:45:44
【问题描述】:
对于我正在学习的课程,我一直在直接使用 Linux 中的clone() 系统调用做一些工作。我很好奇它是如何工作的,并开始进行一些挖掘。令我困惑的是,它似乎依赖于与fork() 功能相同的一些基础(尽管参数不同,但它们调用相同的do_fork() 函数)。一方面,这对我来说很有意义,因为线程实际上只是一个轻量级进程,但我一直认为线程的创建方式与进程的创建方式之间存在一些显着差异。我对do_fork() 和随后的copy_process()(do_fork() 调用)的实现做了一些挖掘,但我无法说服自己我理解发生了什么。
那么,对于那里的大师,我是否遗漏了什么或者这实际上是它的工作原理?是否有标志基本上告诉操作系统要复制多少以及开始执行新任务的指令(我认为答案必须是是,但我只是不知道他们是怎么翻译的)?
下面是我正在查看的代码,也许您可以解释一下传递的参数是如何控制创建轻量级或重量级进程的。
asmlinkage int sys_fork(struct pt_regs *regs){
#ifdef CONFIG_MMU
return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
#else
/* can not support in nommu mode */
return(-EINVAL);
#endif
}
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
int __user *parent_tidptr, int tls_val,
int __user *child_tidptr, struct pt_regs *regs)
{
if (!newsp)
newsp = regs->ARM_sp;
return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
}
谢谢!
【问题讨论】:
-
我之前的回答stackoverflow.com/questions/807506/…你可能会感兴趣。