2009-07-02 55 views
9

在linux系統上,子進程是否像父進程一樣查看現有線程?fork和現有線程?

int main() { 

    //create thread 1 

    int child_pid = fork(); 

    if (0 == child_pid) 
    { 
     .. 
    } 
    else 
    { 
     .. 
    } 

由於爲子進程複製了整個地址空間,因此線程的狀態會發生什麼變化。如果上面的段中的線程1正在等待條件信號,該怎麼辦?它在兒童過程中是否處於等待狀態?

回答

0

線程不是從使用fork()的linux系統上的子進程繼承而來的。一個深入的源代碼在這裏:http://linas.org/linux/threads-faq.html

+2

該FAQ已過時。最大的用戶可見區別在於LinuxTLreads自從內核2.6和glibc 2.3以來一直被NPTL所過時,它解決了所有與非POSIX類似線程行爲有關的突出問題。 – ephemient 2009-07-02 18:20:57

13

現在linux上的線程試圖保持posix complient。只有調用線程複製,沒有其它線程(請注意,例如,在Solaris上,你可以選擇取決於你鏈接什麼庫什麼叉子一樣)

http://www.opengroup.org/onlinepubs/000095399/functions/fork.html

的過程應與創建 單線程。如果多線程進程調用fork(),則新進程 應包含主叫 線程及其整個地址空間的副本, 可能包含 互斥體和其他資源的狀態。 因此,爲避免錯誤,子進程可能只執行 異步信號安全操作,直到調用某個可執行函數 之前的 。叉 處理程序可通過 中的pthread_atfork()函數的手段 建立,以便在fork()調用中維護應用程序 不變量。

+1

謝謝。鏈接有很大的幫助。 – Mac13 2009-07-02 23:39:39