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標志:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
