新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程控制開發之:Linux進程控制編程

        進程控制開發之:Linux進程控制編程

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257131.htm

        3.exit()和_exit()

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

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

        圖7.4exit和_exit函數流程圖

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

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

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

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

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

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

        所需頭文件

        exit:#includestdlib.h>

        _exit:#includeunistd.h>

        函數原型

        exit:voidexit(intstatus)

        _exit:void_exit(intstatus)

        函數傳入值

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

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

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

        /*exit.c*/

        #includestdio.h>

        #includestdlib.h>

        intmain()

        {

        printf(Usingexit...n);

        printf(Thisisthecontentinbuffer);

        exit(0);

        }

        $./exit

        Usingexit...

        Thisisthecontentinbuffer$

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

        以下是示例2的代碼:

        /*_exit.c*/

        #includestdio.h>

        #includeunistd.h>

        intmain()

        {

        printf(Using_exit...n);

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

        _exit(0);

        }

        $./_exit

        Using_exit...

        $

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

        小知識

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

        4.wait()和waitpid()

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

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

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

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

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

        表7.6 wait()函數族語法

        所需頭文件

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

        函數原型

        pid_twait(int*status)

        函數傳入值

        這里的status是一個整型指針,是該子進程退出時的狀態
        ·status若不為空,則通過它可以獲得子進程的結束狀態
        另外,子進程的結束狀態可由中一些特定的宏來測定

        函數返回值

        成功:已結束運行的子進程的進程號
        失敗:-1

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

        表7.7 waitpid()函數語法

        所需頭文件

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

        函數原型

        pid_twaitpid(pid_tpid,int*status,intoptions)

        續表

        函數傳入值

        Pid

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

        pid=-1:等待任何一個子進程退出,此時和wait()作用一樣

        pid=0:等待其組ID等于調用進程的組ID的任一子進程

        pid-1:等待其組ID等于pid的絕對值的任一子進程

        status

        同wait()

        options

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

        WUNTRACED:若實現某支持作業控制,則由pid指定的任一子進程狀態已暫停,且其狀態自暫停以來還未報告過,則返回其狀態

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

        函數返回值

        正常:已經結束運行的子進程的進程號

        使用選項WNOHANG且沒有子進程退出:0

        調用出錯:-1

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


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 礼泉县| 临高县| 丰台区| 融水| 聊城市| 仙桃市| 宁乡县| 华容县| 雷波县| 清丰县| 安阳市| 双鸭山市| 托克托县| 达日县| 南昌县| 浑源县| 南召县| 汽车| 胶州市| 曲麻莱县| 龙泉市| 铜川市| 成安县| 张家港市| 林西县| 长兴县| 东方市| 佛坪县| 阿拉善左旗| 和顺县| 鄢陵县| 长岛县| 怀化市| 潢川县| 巢湖市| 天祝| 镇远县| 锦屏县| 枣庄市| 无为县| 岢岚县|