2014-03-30 74 views

回答

1

是的,一旦fork()系統爲子進程完成,「task_struct」就會被內核初始化。

當程序調用fork()系統調用時,內核開始執行其內部主程序「do_fork」。你可以找到完整的源代碼(fork.c)here

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」不執行「copy_process」例程負責初始化「的task_struct」子進程的。其原型已被定義爲

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

它基本上使舊的task_struct的副本,並開始更新它的各種屬性。因此,一旦fork()系統調用完成,就會有一個新的「task_sturct」用於子進程,該進程存儲有關進程的所有重要信息,該進程在執行進程的不同時間被內核使用。

+0

非常感謝,我有一個更傻的懷疑..如果沒有fork()調用。假設只有一個簡單的程序,那麼task_struct將如何被初始化。 – tunu

+0

@tunu:當父進程調用fork()系統調用時,所有進程/程序都將開始執行。除了init進程(PID = 0)外,fork()是啓動linux/unix中所有進程的唯一方法。例如,當在shell命令提示符處鍵入command(./a.out)時,shell進程(父進程)內部確實爲./a.out調用fork()以及程序如何開始執行。所以task_struct總是會被初始化併爲每個進程維護。 –

+0

我現在明白了。非常感謝 – tunu