核心版本:linux-4.4.18
原始碼位置:這裡
接著**呼叫copy_process()
,它設定了程序描述符以及子程序所需的任何其他核心資料結構。
ftrace_graph_init_task()
初始化ftrace,核心追蹤函式呼叫。
rt_mutex_init_task()
初始化鎖。
copy_creds(p, clone_flags)
拷貝父程序的訊號。
if (nr_threads >= max_threads)
檢查當前使用者的最大執行緒數是否大於max_thread
pf_superpriv
標誌判斷此任務是否使用超級使用者許可權,pf_forknoexec
表示程序沒有呼叫exec
。
呼叫init_sigpending()
來清除掛起的訊號。
呼叫sched_fork()
來分割父子程序之間的剩餘時間片,將子程序狀態置為task_running
,**見這裡。
接下來拷貝所有的程序資訊(files、fs、sighand、signal、mm、namespaces、io、thread_tls)。
alloc_pid()
分配新的pid。
copy_thread_tls()
函式裡面將暫存器%ax
置為0,也是子程序pid
返回0的原因,**點這裡。
做一些清理等工作,返回task_struct
如果返回值沒有錯誤,呼叫wake_up_new_task
將程序插入執行佇列,此時狀態為task_running
。
如果指定了clone_vfork
標誌,它會先讓子程序執行。
返回子程序的pid。
參考文獻
[1] gdb的基本工作原理
[2] 關於likely()與unlikely函式
[3] understanding the structure task_struct
Linux核心原始碼學習之fork的緩衝區
由一道面試題引出比較好,之前寫得太亂了 會顯示幾個 答案是8個 更正 圖中的一共輸出 個數錯了,應該是n 2 n個 後面是另乙個例子和比較亂的講解原因 不看也罷,兩個問題。1 fork父子程序執行順序的不同導致輸出結果的不同 上面的 看上去很簡單,子子孫孫fork就是了,基本上符合我們的一般的猜想,...
linux核心原始碼
1.機器當前使用的核心版本 apuser jianzhangubtnb uname a linux jianzhangubtnb 3.2.0 23 generic 36 ubuntu smp tue apr 10 20 39 51 utc 2012 x86 64 x86 64 x86 64 gnu ...
fork原始碼剖析
1.什麼是程序?程序可以理解為正在執行的程式。程序控制塊 pcb 有作業系統建立和管理。程序控制塊是作業系統能夠支援多程序和提供多處理的關鍵工具。2.程序的建立 1 分配pcb 2 分配位址空間 fork 建立新程序 include includepid t fork void fork 函式的每次...