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描述符的地址. 這是創建進程的關鍵步驟.