正常退出:
- main() 函数调用 return
- 进程调用 exit() ,标准C库
- 进程调用 _exit() 或者 _Exit(),属于系统调用;
补充 - 进程最后一个线程返回
- 最后一个线程调用 pthread_exit
异常退出
7. 调用 abort 。 void abort(void) 中止程序执行,直接从调用的地方跳出。 头文件: #include<stdlib.h>
8. 进程接收到某些信号时,如:ctrl + C
9. 最后一个 线程对 取消(cancellation)请求作出 响应
#include<stdlib.h>
void exit (int status);
void _Exit (int status);
#include<unistd.h>
void _exit (int status);
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
pid_t = pid;
int cnt = 0;
pid = vfork();
if(pid > 0){
while(1){
printf("cnt = %d\n",cnt);
printf("this is a father, pid = %d\n",getpid()); sleep(1);
}
}
else if(pid == 0){
while(1){
printf("this is a son, pid = %d\n",getpid());
sleep(1);
cnt++;
printf("cnt = %d\n",cnt);
if(cnt == 3){
_exit(0); // break; 使用 break 后,cnt 的值不再是 3 ,子进程结束后,cnt 变成一个奇怪的数, break 会破坏;
// 红色警告,进程必须使用 exit 相关的 函数退出,否则就会 产生其他的错误;
}
}
}
printf("cnt = %d\n",cnt);
return 0;
}
运行结果如下:
_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
exit()函数与_exit()函数最大的区别就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);