Linux中的clone()函數

來源:互聯網
上載者:User

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

這裡fn是函數指標,我們知道進程的4要素,這個就是指向程式的指標,就是所謂的“劇本", child_stack明顯是為子進程分配系統堆棧空間(在linux下系統堆棧空間是2頁面,就是8K的記憶體,其中在這塊記憶體中,低地址上放入了值,這個值就是進程式控制制塊task_struct的值),flags就是標誌用來描述你需要從父進程繼承那些資源, 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線程標準,子進程與父進程共用相同的線程群

下面的例子是建立一個線程(子進程共用了父進程虛存空間,沒有自己獨立的虛存空間不能稱其為進程)。父進程被掛起當子線程釋放虛存資源後再繼續執行。

與系統調用clone功能相似的系統調用有fork,但fork事實上只是clone的功能的一部分,clone與fork的主要區別在於傳遞了幾個參數,而當中最重要的參數就是conle_flags,下表是系統定義的幾個clone_flags標誌:
標誌 Value 含義
CLONE_VM 0x00000100 置起此標誌在進程間共用地址空間
CLONE_FS 0x00000200 置起此標誌在進程間共用檔案系統資訊
CLONE_FILES 0x00000400 置起此標誌在進程間共用開啟的檔案
CLONE_SIGHAND 0x00000800 置起此標誌在進程間共用訊號處理常式
如果置起以上標誌所做的處理分別是:
置起CLONE_VM標誌:

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/haiyan0106/archive/2007/11/19/1891907.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.