vfork ,fork 與clone 的區別

2021-06-21 13:59:23 字數 1410 閱讀 5142

linux將建立程序和執行所建立的程序分為2個階段。

第乙個階段是建立。父程序首先複製子程序,所複製出來的子程序擁有自己的任務結構體和系統堆疊,除此之外所有資源都與父程序共享。linux提供兩種方式複製子程序:乙個是fork(),另外乙個是clone()。

fork()函式複製時將父程序的所以資源都通過複製資料結構進行了複製,然後傳遞給子程序,所以fork()函式不帶引數;clone()函式則是將部分父程序的資源的資料結構進行複製,複製哪些資源是可選擇的,這個可以通過引數設定,所以clone()函式帶引數,沒有複製的資源可以通過指標共享給子程序。

clone()函式的宣告如下:int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)

fn為函式指標,此指標指向乙個函式體,即想要建立程序的靜態程式;

child_stack為給子程序分配系統堆疊的指標;

arg就是傳給子程序的引數;

flags為要複製資源的標誌:

clone_parent 建立的子程序的父程序是呼叫者的父程序,新程序與建立它的程序成了「兄弟」而不是「父子」  

clone_fs 子程序與父程序共享相同的檔案系統,包括root、當前目錄、umask  

clone_files 子程序與父程序共享相同的檔案描述符(file descriptor)表 clone_newns 在新的namespace啟動子程序,namespace描述了程序的檔案hierarchy  

clone_sighand 子程序與父程序共享相同的訊號處理(signal handler)表 clone_ptrace 若父程序被trace,子程序也被trace 

clone_vfork 父程序被掛起,直至子程序釋放虛擬記憶體資源 clone_vm 子程序與父程序執行於相同的記憶體空間 clone_pid 子程序在建立時pid與父程序一致

clone_thread linux 2.4中增加以支援posix執行緒標準,子程序與父程序共享相同的執行緒群

fork()可以看出是完全版的clone(),而clone()轉殖的只是fork()的一部分。   

為了提高系統的效率,後來的linux設計者又增加了乙個系統呼叫vfork()。vfork()所建立的不是程序而是執行緒,它所複製的是除了任務結構體和系統堆疊之外的所有資源的資料結構,而任務結構體和系統堆疊是與父程序共用的。

第二個階段就是所建立程序的執行。子程序建立完後一般都會走自己的路。linux為了子程序能做自己的事特意提供了乙個系統呼叫execve(),用以執行乙個可執行程式的映像,這個映像以檔案形式存在(這句話其實就是說用execve()可以呼叫乙個可執行程式,因為這個可執行程式就在磁碟上,所有是以檔案形式存在的,而映像是說已經編譯鏈結好了的,只要調入記憶體就可以執行,一般為二進位制檔案)。vfork建立的子程序要先於父程序執行,子程序執行時,父程序處於掛起狀態,子程序執行完,喚醒父程序。

copy 與 clone 的區別

clone 是傳遞乙個引用,相當於建立乙個指向元字串的乙個指標,而copy使賦值乙個物件.datatable dt new data table datatable dtcopy dt.copy datatable dtclone dt.clone datatable.clone 方法 這兩種方法都...

Java中的clone和深度clone

複製物件 or 複製引用 person p new person 23,zhang person p1 p system.out.println p system.out.println p1 當person p1 p 執行之後,是建立了乙個新的物件嗎?首先看列印結果 person p new pe...

clone的深拷貝與淺拷貝

想要了解淺拷貝和深拷貝之前,要了解的是值傳遞和引用傳遞。值傳遞 傳遞的是變數的值,對該值進行修改不會影響原來變數的值 引用傳遞 傳遞的是變數的在堆中的引用,修改其值,會影響實際變數 這裡只是簡單的介紹,想要詳細了解的話,建議檢視其他部落格 知道了值傳遞和引用傳遞就可以來了解淺拷貝和深拷貝了 淺拷貝 ...