long sys_fork(void)
{
long ret;
current->thread.forking =1;
ret = do_fork(SIGCHLD, 0, NULL, 0, NULL, NULL);
current->thread.forking =0;
return(ret);
}
这里面current->thread.forking 记录了进程复制的过程,与复制本身无关。
sys_fork(void)中调用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,
iner *cild_tidptr )
do_fork()中首先通过查找pidmap_array位图,为子进程分配新的pid
long pid = alloc_pidmap();
copy_process复制进程描述符.如果所有必须的资源都是可用的,该函数返回刚创建
的task_struct描述符的地址. 这是创建进程的关键步骤.