Linux:理解如何终止进程


附知识点:

man手册,一个exit既有命令还有库函数还有系统调用接口

  • man 1 exit 查看exit命令的手册
  • man 2 exit 查看exit库函数的手册
  • man 3 exit 查看exit系统调用接口的手册

进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

进程终止

进程终止:退出一个进程
异常退出:程序运行过程中异常崩溃,程序没有运行完毕
正常退出:程序运行完毕 —(是否结果符合预期)

如何终止一个进程

正常终止(可以通过 echo $? 查看进程退出码):

  1. main函数中的return (退出进程时才会刷新缓冲区)

  2. void exit(int status) —库函数 退出调用进程,将status作为返回值返回给父进程

  3. 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之前,还做了其他工作:

  1. 执行用户通过 atexit或on_exit定义的清理函数。
  2. 关闭所有打开的流,所有的缓存数据均被写入
  3. 调用_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。


如有不同见解,欢迎留言讨论~~

猜你喜欢

转载自blog.csdn.net/AngelDg/article/details/106695341