2010-02-05 85 views
6

我知道fork()在更高的層次上做了什麼。我想知道的是這個 -叉子系統調用後,底層會發生什麼?

  1. 只要有一個fork調用,跟在一個陷阱指令,並控制跳轉執行fork「處理程序」。現在,通過創建另一個地址空間和進程控制塊複製父進程,這個處理程序如何創建子進程,返回2個值,每個進程都有一個值?

  2. 在什麼時候執行fork會返回2個值?

簡而言之,請大家解釋一下分叉事件發生後下級發生的分步事件嗎?

回答

1

這不是很正確 - 正如你所提到的,fork()系統調用的內核一半可以通過進程控制塊來區分兩個進程,但你甚至不需要那樣做。因此,僞代碼的樣子:

int fork() 
{ 
    int orig_pid = getpid(); 

    int new_pid = kernel_do_fork();  // Now there's two processes 

    // Remember, orig_pid is the same in both procs 
    if (orig_pid == getpid()) { 
     return new_pid; 
    } 

    // Must be the child 
    return 0; 
} 

編輯: 天真的版本確實就像你形容 - 它創建了一個新的進程上下文,將所有相關的線程上下文中,將所有的頁面和文件映射,並將新進程放入「準備運行」列表中。

我想你感到困惑的部分是,當這些進程重啓時(即從kernel_do_fork父回報,孩子被安排在第一次),它在開始的的中間函數(即首先執行'if')。這是一個確切副本 - 這兩個進程將執行該函數的後半部分。

+0

可以告訴我,kernel_do_fork()是什麼?它是不是遞歸調用自己? – 2010-02-05 05:46:06

+0

感謝您花時間解釋保羅。 – 2010-02-05 13:13:33

1

返回到每個進程的值是不同的。父/原線程獲取子進程的PID,子進程得到0.

Linux內核通過更改父進程中的eax寄存器中的值copies the current thread來實現此目的。

相關問題