进程终止
- 进程退出场景
- 进程终止
- 如何终止一个进程
- return / exit / _exit 的区别
- return退出
- exit函数
- _exit函数
附知识点:
man手册,一个exit既有命令还有库函数还有系统调用接口
- man 1 exit 查看exit命令的手册
- man 2 exit 查看exit库函数的手册
- man 3 exit 查看exit系统调用接口的手册
进程退出场景
- 代码运行完毕,结果正确
- 代码运行完毕,结果不正确
- 代码异常终止
进程终止
进程终止:退出一个进程
异常退出:程序运行过程中异常崩溃,程序没有运行完毕
正常退出:程序运行完毕 —(是否结果符合预期)
如何终止一个进程
正常终止(可以通过 echo $? 查看进程退出码):
- main函数中的return (退出进程时才会刷新缓冲区)
- void exit(int status) —库函数 退出调用进程,将status作为返回值返回给父进程
- void _exit(int status) — 系统调用接口 退出调用进程,将status返回给父进程
提问:库函数和系统调用接口有什么关系??
库函数封装了系统调用接口,系统调用函数不好用
return / exit / _exit 的区别
- exit / return 退出时都会刷新缓冲区;_exit 退出的时候直接释放资源 ,不刷新缓冲区
- return 之后在 main 函数中的时候才会退出进程, 然而exit 在任意位置调用都会退出调用进程
以上几种进程退出方式,都属于进程的正常退出 (会根据返回值向父进程表示为什么退出了)
异常退出 : 程序崩溃 程序没有运行完毕突然因为某种错误退出了
- ctrl + c,信号终止 (Mac下 control + c)
return退出
return是一种常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。
exit函数
exit最后也会调用_exit, 调用_exit之前,还做了其他工作:
- 执行用户通过 atexit或on_exit定义的清理函数。
- 关闭所有打开的流,所有的缓存数据均被写入
- 调用_exit
代码示例:
int main() {
printf("hello");
exit(0);
}
运行结果:
[root@localhost linux]# ./a.out
hello
[root@localhost linux]#
int main() {
printf("hello");
_exit(0);
}
运行结果:
[root@localhost linux]# ./a.out
[root@localhost linux]#
_exit函数
#include <unistd.h>
void _exit(int status);
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
说明:虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255。
如有不同见解,欢迎留言讨论~~