abort()、exit()、atexit\atexit使用
1. abort()
立即终止当前进程,产生异常程序终止
进程终止时不会销毁任何对象
示例:
/* abort example */ #include <stdio.h> /* fopen, fputs, fclose, stderr */ #include <stdlib.h> /* abort, NULL */ int main () { FILE * pFile; errno_t err; err = fopen_s(&pFile, "myfile.txt", "r"); if (err != 0) { fputs("error opening file\n", stderr); abort(); } fclose (pFile); return 0; }
stdin、stdout、stderr
FILE *stdin; FILE *stdout; FILE *stderr; #include <stdio.h>
以下是输入、输出和错误输出流的标准。
默认情况下,标准输入从键盘读取,而标准输出和错误输出到屏幕。
下面流指针可用访问标准流:
指针 流 stdin
标准输入 stdout
标准输出 stderr
标准错误 这些指针可用作指向函数的参数。 某些函数如 getchar 和
putchar
时,自动使用stdin
和 stdout。这些指针是常数,不能指派新的值。
freopen
函数可用于重定向流到磁盘文件或其他设备。 操作系统可以重定向程序进行标准输入和输出在指令水平。
2. exit()
正常终止进程,并进行清理!
示例:
#include <stdio.h> /* printf, fopen */ #include <stdlib.h> /* exit, EXIT_FAILURE */ int main () { FILE * pFile; errno_t err; err = fopen_s(&pFile, "myfile.txt", "r"); if (err != 0) { fputs("error opening file\n", stderr); exit(EXIT_FAILURE); } else { /* file operations here */ fclose(pFile); } return 0; }
3. atexit (_onexit, _onexit_m)
可指定在程序终止之前执行的 exit-processing 函数。 在执行 exit-processing 函数之前不会销毁在调用
atexit
之前初始化的任何全局静态对象。当程序正常终止时,向
_onexit
函数传递要调用的函数 (function
) 的地址。 对_onexit
的后续调用将创建一个函数注册表,其中的函数按 LIFO(后进先出)顺序执行。 传递到_onexit
的函数不能接受参数。如果从 DLL 范围内调用
_onexit
,则在使用 DLL_PROCESS_DETACH 调用_onexit
之后,向DllMain
注册的例程将会在 DLL 卸载时运行。_onexit
是 Microsoft 扩展。 对于 ANSI 可移植性,使用atexit。 该函数的_onexit_m
版本适用于混合模式。(没懂)示例:
/* atexit example */ #include <stdio.h> /* puts */ #include <stdlib.h> /* atexit */ void fnExit1 (void) { puts ("Exit function 1."); } void fnExit2 (void) { puts ("Exit function 2."); } int main () { atexit (fnExit1); atexit (fnExit2); puts ("Main function."); return 0; } output: Main function. Exit function 2. Exit function 1
以上函数具体情况可从cpp reference 查询