#include <stdlib.h>
void exit(int status);
exit庫函數將終止當前進程,並返回操作系統。status表示進程的退出碼,在stdlib.h頭文件中定義了兩個宏:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#include <unistd.h>
void _exit(int status);
exit函數與_exit函數的區別:exit在結束進程前會執行一些清理工作,包括執行各種終止處理程序、關閉所有標準I/O等,然後才進入內核;而_exit調用將直接進入內核,將清理工作交給內核來完成,這樣I/O緩存將丟失。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
printf("this is the first line\n");
printf("this is the second line");
exit(0);
}
上述測試程序將打印兩行,如果將exit換成_exit,則只打印第一行,第二行被丟失了。
exit和return的最主要區別是:
exit是結束進程,返回OS,return是結束函數,返回調用者那兒;只有main函數調用return時,纔會結束進程。事實上,main函數在結束時會隱式的調用exit。
exit函數運行時首先會執行由atexit()函數登記的函數,然後會做一些自身的清理工作,同時刷新所有輸出流、關閉所有打開的流並且關閉通過標準I/O函數tmpfile()創建的臨時文件。exit是結束一個進程,它將刪除進程使用的內存空間,同時把錯誤信息返回父進程。
#include <stdlib.h>
int atexit (void(*)(void))
atexit()函數的參數是一個函數指針,函數指針指向一個沒有參數也沒有返回值的函數。一個進程最多可以註冊32個終止處理函數,這些處理函數的調用順序與其註冊順序相反。
#include <stdio.h>
#include <stdlib.h>
void exit_fn1(void)
{
printf("Exit function #1 called\n");
}
void exit_fn2(void)
{
printf("Exit function #2 called\n");
}
int main(void)
{
/* post exit function #1 */
atexit(exit_fn1);
/* post exit function #2 */
atexit(exit_fn2);
return 0;
}