<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 進(jìn)程控制開(kāi)發(fā)之:Linux進(jìn)程控制編程

進(jìn)程控制開(kāi)發(fā)之:Linux進(jìn)程控制編程

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257131.htm

3.exit()和_exit()

(1)exit()和_exit()說(shuō)明。

exit()和_exit()都是用來(lái)終止進(jìn)程的。當程序執行到exit()或_exit()時(shí),進(jìn)程會(huì )無(wú)條件地停止剩下的所有操作,清除包括PCB在內的各種數據結構,并終止本進(jìn)程的運行。但是,這兩個(gè)還是有區別的,這兩個(gè)函數的調用過(guò)程如圖7.4所示。

圖7.4exit和_exit函數流程圖

從圖中可以看出,_exit()函數的作用是:直接使進(jìn)程停止運行,清除其使用的內存空間,并清除其在內核中的各種數據結構;exit()函數則在這些基礎上做了一些包裝,在執行退出之前加了若干道工序。exit()函數與_exit()函數最大的區別就在于exit()函數在調用exit系統之前要檢查文件的打開(kāi)情況,把文件緩沖區中的內容寫(xiě)回文件,就是圖中的“清理I/O緩沖”一項。

由于在的標準函數庫中,有一種被稱(chēng)作“緩沖I/O(bufferedI/O)”操作,其特征就是對應每一個(gè)打開(kāi)的文件,在內存中都有一片緩沖區。每次讀文件時(shí),會(huì )連續讀出若干條記錄,這樣在下次讀文件時(shí)就可以直接從內存的緩沖區中讀??;同樣,每次寫(xiě)文件的時(shí)候,也僅僅是寫(xiě)入內存中的緩沖區,等滿(mǎn)足了一定的條件(如達到一定數量或遇到特定字符等),再將緩沖區中的內容一次性寫(xiě)入文件。

這種技術(shù)大大增加了文件讀寫(xiě)的速度,但也為編程帶來(lái)了一些麻煩。比如有些數據,認為已經(jīng)被寫(xiě)入文件中,實(shí)際上因為沒(méi)有滿(mǎn)足特定的條件,它們還只是被保存在緩沖區內,這時(shí)用_exit()函數直接將進(jìn)程關(guān)閉,緩沖區中的數據就會(huì )丟失。因此,若想保證數據的完整性,就一定要使用exit()函數。

(2)exit()和_exit()函數語(yǔ)法。

表7.5列出了exit()和_exit()函數的語(yǔ)法規范。

表7.5 exit()和_exit()函數族語(yǔ)法

所需頭文件

exit:#includestdlib.h>

_exit:#includeunistd.h>

函數原型

exit:voidexit(intstatus)

_exit:void_exit(intstatus)

函數傳入值

status是一個(gè)整型的參數,可以利用這個(gè)參數傳遞進(jìn)程結束時(shí)的狀態(tài)。一般來(lái)說(shuō),0表示正常結束;其他的數值表示出現了錯誤,進(jìn)程非正常結束。
在實(shí)際編程時(shí),可以用wait()系統調用接收子進(jìn)程的返回值,從而針對不同的情況進(jìn)行不同的處理

(3)exit()和_exit()使用實(shí)例。

這兩個(gè)示例比較了exit()和_exit()兩個(gè)函數的區別。由于printf()函數使用的是緩沖I/O方式,該函數在遇到“n”換行符時(shí)自動(dòng)從緩沖區中將記錄讀出。示例中就是利用這個(gè)性質(zhì)來(lái)進(jìn)行比較的。以下是示例1的代碼:

/*exit.c*/

#includestdio.h>

#includestdlib.h>

intmain()

{

printf(Usingexit...n);

printf(Thisisthecontentinbuffer);

exit(0);

}

$./exit

Usingexit...

Thisisthecontentinbuffer$

讀者從輸出的結果中可以看到,調用exit()函數時(shí),緩沖區中的記錄也能正常輸出。

以下是示例2的代碼:

/*_exit.c*/

#includestdio.h>

#includeunistd.h>

intmain()

{

printf(Using_exit...n);

printf(Thisisthecontentinbuffer);/*加上回車(chē)符之后結果又如何*/

_exit(0);

}

$./_exit

Using_exit...

$

讀者從最后的結果中可以看到,調用_exit()函數無(wú)法輸出緩沖區中的記錄。

小知識

在一個(gè)進(jìn)程調用了exit()之后,該進(jìn)程并不會(huì )立刻完全消失,而是留下一個(gè)稱(chēng)為僵尸進(jìn)程(Zombie)的數據結構。僵尸進(jìn)程是一種非常特殊的進(jìn)程,它已經(jīng)放棄了幾乎所有的內存空間,沒(méi)有任何可執行代碼,也不能被調度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內存空間。

4.wait()和waitpid()

(1)wait()和waitpid()函數說(shuō)明。

wait()函數是用于使父進(jìn)程(也就是調用wait()的進(jìn)程)阻塞,直到一個(gè)子進(jìn)程結束或者該進(jìn)程接到了一個(gè)指定的信號為止。如果該父進(jìn)程沒(méi)有子進(jìn)程或者他的子進(jìn)程已經(jīng)結束,則wait()就會(huì )立即返回。

waitpid()的作用和wait()一樣,但它并不一定要等待第一個(gè)終止的子進(jìn)程,它還有若干選項,如可提供一個(gè)非阻塞版本的wait()功能,也能支持作業(yè)控制。實(shí)際上wait()函數只是waitpid()函數的一個(gè)特例,在內部實(shí)現wait()函數時(shí)直接調用的就是waitpid()函數。

(2)wait()和waitpid()函數格式說(shuō)明。

表7.6列出了wait()函數的語(yǔ)法規范。

表7.6 wait()函數族語(yǔ)法

所需頭文件

#includesys/types.h>
#includesys/wait.h>

函數原型

pid_twait(int*status)

函數傳入值

這里的status是一個(gè)整型指針,是該子進(jìn)程退出時(shí)的狀態(tài)
·status若不為空,則通過(guò)它可以獲得子進(jìn)程的結束狀態(tài)
另外,子進(jìn)程的結束狀態(tài)可由中一些特定的宏來(lái)測定

函數返回值

成功:已結束運行的子進(jìn)程的進(jìn)程號
失?。?1

表7.7列出了waitpid()函數的語(yǔ)法規范。

表7.7 waitpid()函數語(yǔ)法

所需頭文件

#includesys/types.h>
#includesys/wait.h>

函數原型

pid_twaitpid(pid_tpid,int*status,intoptions)

續表

函數傳入值

Pid

pid>0:只等待進(jìn)程ID等于pid的子進(jìn)程,不管已經(jīng)有其他子進(jìn)程運行結束退出了,只要指定的子進(jìn)程還沒(méi)有結束,waitpid()就會(huì )一直等下去

pid=-1:等待任何一個(gè)子進(jìn)程退出,此時(shí)和wait()作用一樣

pid=0:等待其組ID等于調用進(jìn)程的組ID的任一子進(jìn)程

pid-1:等待其組ID等于pid的絕對值的任一子進(jìn)程

status

同wait()

options

WNOHANG:若由pid指定的子進(jìn)程不立即可用,則waitpid()不阻塞,此時(shí)返回值為0

WUNTRACED:若實(shí)現某支持作業(yè)控制,則由pid指定的任一子進(jìn)程狀態(tài)已暫停,且其狀態(tài)自暫停以來(lái)還未報告過(guò),則返回其狀態(tài)

0:同wait(),阻塞父進(jìn)程,等待子進(jìn)程退出

函數返回值

正常:已經(jīng)結束運行的子進(jìn)程的進(jìn)程號

使用選項WNOHANG且沒(méi)有子進(jìn)程退出:0

調用出錯:-1

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>