关于exit(),_exit(),_Exit()
author: i.sshe
email: i.sshe@foxmail.com
github: https://github.com/isshe
- 综述: _exit()和_Exit()立即进入内核,exit()则先执行一些清理处理,然后返回内核.
1). exit(): 正常终止进程。所有atexit()和on_exit()注册的处理函数都会被反序调用.总会执行一个标准I/O库的清理关闭操作:对所有打开流调用fclose()函数.。
2). _exit()/_Exit(): 立刻(immediately)终止进程。不进行终止处理。 函数原型
1).exit(): statue&0377的值(状态)返回给父进程。(注意exit()是没有返回值的)#include <stdlib.h> void exit(int status);
2)._exit()/_Exit():
#include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status);
- 图示:一个C程序是如何启动和终止的
4. exit()/_exit()/_Exit()
1).示例代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
pid_t p1 ;
pid_t p2 ;
p1 = fork();
if (p1 == 0)
{
printf("_exit()1!\n");
printf("_exit()2!");//注意这里没有\n
_exit(1);
}
else if (p1 > 0)
{
p2 = fork();
if(p2 == 0)
{
printf("_Exit()1!\n");
printf("_Exit()2!");
_Exit(2);
}
else if (p2 > 0)
{
printf("exit()1\n");
printf("exit()2");
exit(3);
}
else
{;}
}
else
{;}
}
2).结果截图:
3). 结果分析:
exit()终止进程时,清理了I/O缓冲区,而_exit()和_Exit()则没有清理缓冲区.
所以,exit()输出了两个,_exit(),_Exit()只输出一个.
5. atexit()
1). 终止处理程序实例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void my_exit1(void);
static void my_exit2(void);
static void my_exit3(void);
int main(void)
{
if (atexit(my_exit2) != 0)
{
printf("注册my_exit2失败!\n");
}
if (atexit(my_exit1) != 0)
{
printf("注册my_exit1失败!\n");
}
if (atexit(my_exit3) != 0)
{
printf("注册my_exit3失败!\n");
}
printf("main is done!\n");
exit(0);
// return 0;
}
static void my_exit1(void)
{
printf("I am my_exit1()!\n");
}
static void my_exit2(void)
{
printf("I am my_exit2()!\n");
}
static void my_exit3(void)
{
printf("I am my_exit3()!\n");
}
2). 结果截图:
3). 结果分析:
进程终止处理函数的调用顺序和注册时候相反.
注意:内核使程序执行的唯一方法是调用一个exec函数.
- 参考资料:
<<unix环境高级编程 第三版>>