深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果
Linux下編程,線程、進(jìn)程退出順序問(wèn)題紛紛擾擾,如果父進(jìn)程/線程先于子進(jìn)程/線程終止,系統(tǒng)會(huì)做什么處理呢?反之,如果子進(jìn)程/線程先于父進(jìn)程/線程終止,系統(tǒng)又會(huì)做什么處理呢?下面是我個(gè)人平時(shí)在筆記上做的一些象征性的總結(jié),如果有疑問(wèn)之處,大可提出,我一直認(rèn)為懷疑是人類進(jìn)步的根本所在。
一、線程
Linux線程創(chuàng)建函數(shù)為pthread_create(),默認(rèn)規(guī)則是誰(shuí)創(chuàng)建子線程,誰(shuí)就要負(fù)責(zé)子線程的資源回收,當(dāng)父線程退出后,子線程也隨著退出。所以,一般情況下,父線程退出時(shí)都要確保子線程已經(jīng)退出,所以會(huì)使用pthread_join()函數(shù)阻塞等待子線程的退出信號(hào)/標(biāo)識(shí)。
pthread_detach(threadid)函數(shù)的功能是使線程ID為threadid的線程處于分離狀態(tài)(可以為非父子關(guān)系),一旦線程處于分離狀態(tài),該線程終止時(shí)底層資源立即被回收;否則終止子線程的狀態(tài)會(huì)一直保存占用系統(tǒng)的資源直到主線程調(diào)用pthread_join(threadid,NULL)獲取線程的退出狀態(tài)。被創(chuàng)建的子線程也可以自己分離自己,子線程調(diào)用pthread_detach(pthread_self())就是分離自己,因?yàn)閜thread_self()這個(gè)函數(shù)返回的就是自己本身的線程ID。
1)父線程先于子線程終止
父線程先于子線程,則子線程為異常退出 ,那肯定沒(méi)有使用阻塞非分離函數(shù)pthread_join,分2種情況:
a)子線程已與父線程分離,如調(diào)用線程分離函數(shù)pthread_detach,則資源被自動(dòng)回收釋放。
b)子線程未與父線程分離,則資源無(wú)法釋放,造成了資源浪費(fèi)和系統(tǒng)臃腫(這種情況,我看有些資料上說(shuō)系統(tǒng)也能自動(dòng)釋放子線程的資源,如關(guān)閉描述符,釋放內(nèi)存空間等等,但個(gè)人做過(guò)一些測(cè)試,比如在子線程中分配很多空間等,進(jìn)程退出后,top查看內(nèi)存狀態(tài)時(shí)還存在)。
2)子線程先于父線程終止
也分2種情況:
a)正常情況:子線程調(diào)用了線程分離函數(shù)ptread_detach(),或父線程調(diào)用了等待線程結(jié)束函數(shù)pthread_join()。
b)異常情況:如果上面二者都為調(diào)用,則為子線程分配的資源無(wú)法得到釋放。
二、進(jìn)程
一個(gè)現(xiàn)有進(jìn)程可以調(diào)用fork函數(shù)創(chuàng)建一個(gè)新進(jìn)程。由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程(child process)。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程ID。
1)父進(jìn)程先于子進(jìn)程終止
當(dāng)父進(jìn)程先退出時(shí),系統(tǒng)會(huì)讓init進(jìn)程接管子進(jìn)程,該子線程成為了孤兒進(jìn)程。
2)子進(jìn)程先于父進(jìn)程終止
分為2種情況:
a)正常情況:父進(jìn)程調(diào)用了wait函數(shù) (非父子進(jìn)程則用waitpid函數(shù)),此時(shí)父進(jìn)程會(huì)等待子進(jìn)程結(jié)束。
b)父進(jìn)程又沒(méi)有調(diào)用wait函數(shù) (非父子進(jìn)程則未調(diào)用waitpid函數(shù)),此種情況子進(jìn)程進(jìn)入僵死狀態(tài)即僵尸進(jìn)程,并且會(huì)一直保持下去直到系統(tǒng)重啟。子進(jìn)程處于僵死狀態(tài)時(shí),內(nèi)核只保存進(jìn)程的一些必要信息以備父進(jìn)程所需。此時(shí)子進(jìn)程始終占有著資源,同時(shí)也減少了系統(tǒng)可以創(chuàng)建的最大進(jìn)程數(shù)。
僵死狀態(tài):一個(gè)已經(jīng)終止、但是其父進(jìn)程尚未對(duì)其進(jìn)行善后處理(獲取終止子進(jìn)程的有關(guān)信息,釋放它仍占有的資源)的進(jìn)程被稱為僵死進(jìn)程(zombie)。ps命令將僵死進(jìn)程的狀態(tài)打印為Z 。
上一篇:Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼
欄 目:C語(yǔ)言
下一篇:深入理解大數(shù)與高精度數(shù)的處理問(wèn)題
本文標(biāo)題:深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4495.html
您可能感興趣的文章
- 01-10基于C程序啟動(dòng)代碼的深入分析
- 01-10Linux線程管理必備:解析互斥量與條件變量的詳解
- 01-10深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文
- 01-10基于C語(yǔ)言指令的深入分析
- 01-10深入分析C中不安全的sprintf與strcpy
- 01-10C 轉(zhuǎn)移表/轉(zhuǎn)換表的深入分析
- 01-10c++ 虛函數(shù)與純虛函數(shù)的區(qū)別(深入分析)
- 01-10基于C++內(nèi)存分配、函數(shù)調(diào)用與返回值的深入分析
- 01-10C++輸入輸出操作符重載的深入分析
- 01-10用C++實(shí)現(xiàn)strcpy(),返回一個(gè)char*類型的深入分析


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載