exit(0) 表示程式正常, exit(1)/exit(-1)表示程式異常退出
exit() 結束當前進程/當前程式/,在整個程式中,只要調用 exit ,就結束return() 是當前函數返回,當然如果是在主函數main, 自然也就結束當前進程了,如果不是,那就是退回上一層調用。在多個進程時.如果有時要檢測上進程是否正常退出的.就要用到上個進程的傳回值..exit(1)表示進程正常退出. 返回 1;exit(0)表示進程非正常退出. 返回 0.
進程環境與進程式控制制(1): 進程的開始與終止1. 進程的開始:
C程式是從main函數開始執行, 原型如下:
int main(int argc, char *argv[]);
通常main的傳回值是int型, 正確返回0.
如果main的傳回值為void或者無, 某些編譯器會給出警告, 此時main的傳回值通常是0.關於main的命令列參數不做過多解釋, 以下面的程式展示一下:
#include <stdio.h>int main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++)
printf("argv[%d]: %s\n", i, argv[i]);
return 0;
}
2. 進程終止:
C程式的終止分為兩種: 正常終止和異常終止.
正常終止分為: return, exit, _exit, _Exit, pthreade_exit
異常中指分為: abort, SIGNAL, 線程響應取消
主要說一下正常終止的前4種, 即exit系列函數.
#include <stdlib.h> /* ISO C */
void exit(int status);
void _Exit(int status);
#include <unistd.h> /* POSIX */
void _exit(int status);
以上3個函數的區別是:
exit()(或return 0)會調用終止處理常式和使用者空間的標準I/O清理程式(如fclose), _exit和_Exit不調用而直接由核心接管進行清理.
因此, 在main函數中exit(0)等價於return 0.3. atexit終止處理常式:
ISO C規定, 一個進程最對可登記32個終止處理函數, 這些函數由exit按登記相反的順序自動調用. 如果同一函數登記多次, 也會被調用多次.
原型如下:
#include <stdlib.h>
int atexit(void (*func)(void));
其中參數是一個函數指標, 指向終止處理函數, 該函數無參無傳回值.以下面的程式為例:
#include <stdlib.h>static void myexit1()
{
printf("first exit handler\n");
}static void myexit2()
{
printf("second exit handler\n");
}int main()
{
if (atexit(my_exit2) != 0)
printf("can't register my_exit2\n");
if (atexit(my_exit1) != 0)
printf("can't register my_exit1\n");
if (atexit(my_exit1) != 0)
printf("can't register my_exit1\n"); printf("main is done\n");
return 0;
}
運行結果:
$ ./a.out
main is done
first exit handler
first exit handler
second exit handler運行結果:
$./a.out arg1 arg2 arg3
argv[0]: ./a.out
argv[1]: arg1
argv[2]: arg2
argv[3]: arg3