搞定Linux进程实战(3):进程结束与exec函数家族 - 认识进程的各种终结方法
最编程
2024-01-15 15:33:53
...
(1)正常退出
从main函数返回[return]
调用exit
调用_exit/_Exit
(2)异常退出
调用abort 产生SIGABOUT信号
由信号终止 Ctrl+C [SIGINT]
...(并不完全, 如return/pthread_exit等)
测试[exit/_exit]
//尝试查看该程序的打印输出 int main() { cout << "In main, pid = " << getpid(); //去掉了endl; //原理:与终端关联,stdout为行缓冲,在文件中,为全缓冲; //详细信息请参考《UNIX环境高级编程》(第三版)8.5节, P188 //exit(0);为C库函数,详细解释如下 _exit(0); }
由图可知,系统调用_exit直接陷入内核,而C语言库函数是经过一系列的系统清理工作,再调用Linux内核的;
int main() { cout << "In main, pid = " << getpid(); fflush(stdout); //增加了刷新缓冲区工作 _exit(0); }
小结:exit与_exit区别
1)_exit是一个系统调用,exit是一个c库函数
2)exit会执行清除I/O缓存
3)exit会执行调用终止处理程序 //终止处理程序如下
终止处理程序:atexit
#include <stdlib.h> int atexit(void (*function)(void));
//测试 void exitHandler1(void) { cout << "If exit with exit, the function exitHandler will be called1" << endl; } void exitHandler2(void) { cout << "If exit with exit, the function exitHandler will be called2" << endl; } int main() { cout << "In main, pid = " << getpid() << endl; atexit(exitHandler1); //注意,先注册的后执行 atexit(exitHandler2); exit(0); }
异常终止
int main() { cout << "In main, pid = " << getpid() << endl; atexit(exitHandler1); atexit(exitHandler2); abort(); //exit(0); }