Linux中的进程终止
- 1. 进程退出场景
- 2. 进程常见退出方法
- 2.1 _exit函数
- 2.2 exit函数
- 2.3 return退出
1. 进程退出场景
- 代码运行完毕,结果正确
- 代码运行完毕,结果不正确
- 代码异常终止
2. 进程常见退出方法
正常终止(可以通过 echo $? 查看进程退出码)
1. 从main返回
#include <stdio.h>
int main()
{
printf("测试退出码\n");
return 9;
}
2. 调用exit
#include <stdio.h>
int main()
{
printf("测试退出码");
sleep(3);
exit(1);
}
3. _exit
一样的代码,exit()换成_exit();
int main()
{
printf("测试退出码");
sleep(3);
_exit(1);
}
什么都不刷新,程序直接退出
异常退出:
ctrl + c,信号终止
2.1 _exit函数
功能:exit函数用于正常终止程序的执行,并返回一个整数值给操作系统,表示程序的退出状态。它会执行一系列的清理工作,例如关闭打开的文件、释放动态分配的内存等,然后将状态码传递给操作系统。状态码通常用来向调用程序传递一些信息,例如指示执行是否成功或失败。
#include <unistd.h>
void _exit(int status);
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
- 说明:虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255。
- exit函数还会刷新标准I/O缓冲区,以确保输出被正确写入文件。
2.2 exit函数
功能:_exit函数用于立即终止程序的执行,不执行任何清理工作,不刷新I/O缓冲区。它直接将状态码传递给操作系统,然后操作系统会终止程序的执行。
#include <unistd.h>
void exit(int status);
exit最后也会调用exit, 但在调用exit之前,还做了其他工作:
-
- 执行用户通过 atexit或on_exit定义的清理函数。
-
- 关闭所有打开的流,所有的缓存数据均被写入
-
- 调用_exit
- 调用_exit
2.3 return退出
- return语句用于从函数中返回,并可选择返回一个值。当return语句执行时,它会立即退出当前函数,并将控制权返回给调用该函数的地方。
- return是一种更常见的退出进程方法。执行return等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。