Linux学习之exit函数
生活随笔
收集整理的這篇文章主要介紹了
Linux学习之exit函数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
From: http://hi.baidu.com/homappy/item/549b37c06865877488ad9e75
若父進程在子進程之前終止了,則子進程的父進程將變?yōu)閕nit進程,其PID為1;保證每個進程都有父進程。
Linux學(xué)習(xí)之"exit函數(shù)"
先看下"_exit"和"exit":
exit被調(diào)用時,將沖刷所有的標準I/O流,關(guān)閉所有打開的文件描述符。在傳統(tǒng)實現(xiàn)中,同時也將關(guān)閉標準I/O流。即表示標準輸出FILE對象的相關(guān)存儲區(qū)將被清0。而_exit不會執(zhí)行這些操作。 由于父子進程共享同一地址空間,當(dāng)父進程恢復(fù)運行并調(diào)用printf時,不會產(chǎn)生任何輸出,它返回-1。這就是上一節(jié)調(diào)用_exit的原因。 然而,大多數(shù)exit的現(xiàn)代實現(xiàn)不再關(guān)閉流。因為進程即將終止,內(nèi)核將關(guān)閉所有已打開的文件描述符。 Linux程序的終止分為"正常終止"和"異常終止",具體可能情況如下: 正常終止從main返回
調(diào)用exit:ISO?C定義
調(diào)用_exit或_Exit:前者由ISO?C定義,后者由POSIX.1定義
最后一個線程從其啟動例程返回
最后一個線程調(diào)用pthread_exit
異常終止調(diào)用abort:產(chǎn)生SIGABRT信號
接到某些信號
最后一個線程對取消請求做出響應(yīng)
幾個要點: 1.不管進程如何終止,最后都會執(zhí)行內(nèi)核中的同一段代碼:為相應(yīng)進程關(guān)閉所有打開描述符,釋放內(nèi)存等等。 2.若父進程在子進程之前終止了,則子進程的父進程將變?yōu)閕nit進程,其PID為1;保證每個進程都有父進程。 3.當(dāng)子進程先終止,父進程如何知道子進程的終止狀態(tài)?事實上,內(nèi)核為每個終止子進程保存了終止狀態(tài)等信息,父進程調(diào)用wait等函數(shù),就可獲取該信息。 4.當(dāng)父進程調(diào)用wait等函數(shù)后,內(nèi)核將釋放終止進程所使用的所有內(nèi)存,關(guān)閉其打開的所有文件。 5.對于已經(jīng)終止、但是其父進程尚未對其調(diào)用wait等函數(shù)的進程,被稱為僵尸進程(即已經(jīng)結(jié)束,但尚未釋放資源的)。 6.對于父進程先終止,而被init領(lǐng)養(yǎng)的進程會是僵尸進程嗎?init對每個終止的子進程,都會調(diào)用wait函數(shù),獲取其終止狀態(tài)信息。 綜上所述,子進程調(diào)用exit后,父進程必須調(diào)用wait。總結(jié)
以上是生活随笔為你收集整理的Linux学习之exit函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cacti 被监控机器snmp 配置
- 下一篇: 王道计算机考研数据结构—学习笔记Chap