#include
void
void
int
#include
void
exit,
abort
atexit
其参数是要调用的函数地址。参数函数是一个无参数无返回值的函数。atexit可以登记32个函数,这些函数由
exit
_exit
_Exit
exit和_exit函数
exit和_exit函数用于正常终止一个程序:
#include
void
#include
void
使用不同头文件的原因是:exit是由ANSI
由于历史原因,
注意,内核使程序执行的唯一方法是调用一个e
如下代码说明了exit终止了一个程序
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int
{
exit(status
}
输出结果为:
如下代码说明了exit终止程序之前调用atexit以及调用的函数的顺序。
#include<stdio.h>
#include<stdlib.h>
void
{
}
void
{
}
int
{
exit(0);
// _exit(0);
// abort();
}
使用exit(0)和return
可以看到先注册的exit_fn1后执行。并且注册的函数无参数无返回值。另外,如果使用_exit(0),则不会有输出结果,因为_exit(0)不执行atexit注册的函数。
如下是使用_exit(0)和exit(0)对标准IO缓冲区是否刷新的比较操作:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int
{
printf("output
printf("output
_exit(0);
//exit(0);
return
}
在linux和windows下执行exit均会输
output
content
而在linux执行_exit则只会输出output
对应每个打开的文件,在内存中都有一片缓冲区。每次读文件时,会读出若干条记录,这样下次读文件就可以直接从内存的缓冲区中读取,每次写文件的时候也仅仅是写入内存中的缓冲区,等满足了一定条件(达到一定数量,遇到特定字符如换行符\n和文件结束符EOF),再将缓冲区中的内容一次性写入文件。
printf会根据参数format字符串来转换并格式化数据,然后将结果写到标准输出设备,直到出现字符串结束符\0为止。
可见,exit将未出现换行符的语句保存到标准输出文件。而由于第二条printf没有满足特定条件,只是保存在缓冲区,使用_exit()函数直接将进程关闭,缓冲区就会丢失。
return与exit的区别
在进程操作中exit是结束当前进程或程序并把控制权返回给调用该程序或者进程的进程即父进程并告诉父进程该当前进程的运行状态,而return是从当前函数返回,如果是在main函数中,main函数结束时隐式地调用exit函数,自然也就结束了当前进程。