int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
這里fn是函數(shù)指針,我們知道進(jìn)程的4要素,這個(gè)就是指向程序的指針,就是所謂的“劇本", child_stack明顯是為子進(jìn)程分配系統(tǒng)堆棧空間(在linux下系統(tǒng)堆棧空間是2頁面,就是8K的內(nèi)存,其中在這塊內(nèi)存中,低地址上放入了值,這個(gè)值就是進(jìn)程控制塊task_struct的值),flags就是標(biāo)志用來描述你需要從父進(jìn)程繼承那些資源, arg就是傳給子進(jìn)程的參數(shù))。下面是flags可以取的值
標(biāo)志???????????????????含義
?CLONE_PARENT??創(chuàng)建的子進(jìn)程的父進(jìn)程是調(diào)用者的父進(jìn)程,新進(jìn)程與創(chuàng)建它的進(jìn)程成了“兄弟”而不是“父子”
?CLONE_FS??????????子進(jìn)程與父進(jìn)程共享相同的文件系統(tǒng),包括root、當(dāng)前目錄、umask
?CLONE_FILES?????子進(jìn)程與父進(jìn)程共享相同的文件描述符(file descriptor)表
?CLONE_NEWNS??在新的namespace啟動(dòng)子進(jìn)程,namespace描述了進(jìn)程的文件hierarchy
?CLONE_SIGHAND??子進(jìn)程與父進(jìn)程共享相同的信號(hào)處理(signal handler)表
?CLONE_PTRACE??若父進(jìn)程被trace,子進(jìn)程也被trace
?CLONE_VFORK????父進(jìn)程被掛起,直至子進(jìn)程釋放虛擬內(nèi)存資源
?CLONE_VM??????????子進(jìn)程與父進(jìn)程運(yùn)行于相同的內(nèi)存空間
?CLONE_PID?????????子進(jìn)程在創(chuàng)建時(shí)PID與父進(jìn)程一致
?CLONE_THREAD???Linux 2.4中增加以支持POSIX線程標(biāo)準(zhǔn),子進(jìn)程與父進(jìn)程共享相同的線程群
下面的例子是創(chuàng)建一個(gè)線程(子進(jìn)程共享了父進(jìn)程虛存空間,沒有自己獨(dú)立的虛存空間不能稱其為進(jìn)程)。父進(jìn)程被掛起當(dāng)子線程釋放虛存資源后再繼續(xù)執(zhí)行。
與系統(tǒng)調(diào)用clone功能相似的系統(tǒng)調(diào)用有fork,但fork事實(shí)上只是clone的功能的一部分,clone與fork的主要區(qū)別在于傳遞了幾個(gè)參數(shù),而當(dāng)中最重要的參數(shù)就是conle_flags,下表是系統(tǒng)定義的幾個(gè)clone_flags標(biāo)志:
標(biāo)志 Value 含義
CLONE_VM 0x00000100 置起此標(biāo)志在進(jìn)程間共享地址空間
CLONE_FS 0x00000200 置起此標(biāo)志在進(jìn)程間共享文件系統(tǒng)信息
CLONE_FILES 0x00000400 置起此標(biāo)志在進(jìn)程間共享打開的文件
CLONE_SIGHAND 0x00000800 置起此標(biāo)志在進(jìn)程間共享信號(hào)處理程序
如果置起以上標(biāo)志所做的處理分別是:
置起CLONE_VM標(biāo)志:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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