1. 程式人生 > >linux c 退出進程的代碼

linux c 退出進程的代碼

保留 過程 寫文件 每一個 寫入 特定字符 輸出 由於 一點

將寫內容過程經常用的一些內容片段收藏起來,如下的資料是關於linux c 退出進程的內容。

#include<stdlib.h>

voidexit(int status);

voidabort(void)
#include<unistd.h>

void_exit(int status)
#include<assert.h>

voidassert(int expression)

atexit:在其中註冊的無參數函數在退出時調用。成功返回0失敗返回-1,並影響errnoon_exit:在其中註冊的有參數函數在退出時調用。成功返回0失敗返回-1,並影響errnoassert是宏定義,檢查是否出錯,出錯則退出。abort發送SIGABRT消息結束當前進程。exit和_exit函數都是用來終止進程的。當程序執行到exit或_exit時,系統無條件的停止剩下所有操作,清除包括PCB在內的各種數據結構,並終止本進程的運行。但是,這兩個函數是有區別的。exit()函數與_exit()函數最大區別就在於exit()函數在調用do_exit之前要檢查文件的打開情況,把文件緩沖區的內容寫回文件。由於Linux的標準函數庫中,有一種被稱作“緩沖I/O”的操作,其特征就是對應每一個打開的文件,在內存中都有一片緩沖區。每次讀文件時,會連續的讀出若幹條記錄,這樣在下次讀文件時就可以直接從內存的緩沖區讀取;同樣,每次寫文件的時候也僅僅是寫入內存的緩沖區,等滿足了一定的條件(如達到了一定數量或遇到特定字符等),再將緩沖區中的內容一次性寫入文件。這種技術大大增加了文件讀寫的速度,但也給編程代來了一點兒麻煩。比如有一些數據,認為已經寫入了文件,實際上因為沒有滿足特定的條件,它們還只是保存在緩沖區內,這時用_exit()函數直接將進程關閉,緩沖區的數據就會丟失。因此,要想保證數據的完整性,就一定要使用exit()函數。exit的函數聲明在stdlib.h頭文件中。_exit的函數聲明在unistd.h頭文件當中。下面的實例比較了這兩個函數的區別。printf函數就是使用緩沖I/O的方式,該函數在遇到“n”換行符時自動的從緩沖區中將記錄讀出。實例就是利用這個性質進行比較的。exit.c源碼

#include<stdlib.h>

#include<stdio.h>

intmain(void)

{

    printf("Using exit...n");

    printf("This is the content inbuffer");

    exit(0);

}

輸出信息:Usingexit...Thisisthecontentinbuffer

#include<unistd.h>

#include<stdio.h>

intmain(void)

{

    printf("Using exit...n");

    printf("This is the content inbuffer");

    _exit(0);

}

則只輸出:Usingexit...說明:在一個進程調用了exit之後,該進程並不會馬上完全小時,而是留下一個稱為僵屍進程(Zombie)的數據結構。僵屍進程是一種非常特殊的進程,它幾乎已經放棄了所有的內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其它進程收集,除此之外,僵屍進程不再占有任何內存空間。

linux c 退出進程的代碼