Balabala函數(shù)的啟動(dòng)和退出機(jī)制
? ? ? ?在linux系統(tǒng)中,啟動(dòng)一個(gè)可執(zhí)行程序program,便在內(nèi)核中生成一個(gè)進(jìn)程process,且被內(nèi)核賦予一個(gè)唯一的非負(fù)整數(shù)的進(jìn)程號(hào)PID(process ID)。內(nèi)核通過一個(gè)task_struct結(jié)構(gòu)體(進(jìn)程表項(xiàng)/進(jìn)程控制塊)維護(hù)和記錄該進(jìn)程的所有信息,例如進(jìn)程狀態(tài)state,優(yōu)先級(jí)priority,終端信息tty_struct,目錄信息fs_struct,文件信息files_struct,內(nèi)存映射mm_struct,信號(hào)信息signal_struct等。
? ? ? 言歸正傳。當(dāng)一個(gè)程序執(zhí)行前,即運(yùn)行main函數(shù)前,內(nèi)核會(huì)先行啟動(dòng)一個(gè)特殊的例程?啟動(dòng)例程。對(duì)了,它的作用有三:
? ? 1/將命令行上的函數(shù)參數(shù)傳給argc,argv;
? ? 2/創(chuàng)建環(huán)境表傳遞給函數(shù);
? ? 3/登記進(jìn)程的終止函數(shù)
之后內(nèi)核便正常啟動(dòng)我們的進(jìn)程!
? ? ? 那么進(jìn)程又是如何結(jié)束的呢?
? ? ? 一般進(jìn)程的結(jié)束分為三種?
1/正常結(jié)束;即通過return ?exit ?_exit(_Exit) ?pthread_exit返回,或者是通過最后一個(gè)線程的啟動(dòng)例程返回;
2/異常結(jié)束;通過調(diào)用abort,或發(fā)送終止信號(hào),取消請(qǐng)求的響應(yīng);
3/進(jìn)程返回。正常返回0,不正常返回非0。
一個(gè)例子?
Q:如何定義自己的終止函數(shù)?
A:int atexit(void (*term_function)(void))
通過atexit()函數(shù)可以像內(nèi)核自定義注冊(cè)終止函數(shù),也可以在同一個(gè)程序中注冊(cè)多個(gè)自定義終止函數(shù),它們按照先注冊(cè)后運(yùn)行的棧方式在程序調(diào)用exit或return后運(yùn)行。需要特別注意的是如果程序中調(diào)用的是系統(tǒng)退出函數(shù)_exit,則我們自定義的終止函數(shù)將不會(huì)被執(zhí)行,且也不會(huì)refresh程序的緩沖區(qū)(可以在程序結(jié)束前調(diào)用fflush強(qiáng)制refresh)。
無圖無真相!