进程退出分为正常退出&异常退出
正常退出:
1、main函数调用return
2、进程调用exit(),标准c库
3、进程调用_exit()或者_Exit(),属于系统调用
补充
1、进程最后一个线程返回
2、最后一个线程调用pthread_exit
异常退出:
1、调用abort,等于放弃当前进程
2、当进程收到某些信号时,如ctrl+c
3、最后一个线程对取消(cancellatio)请求做出响应
不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等。
对以上任意一种终止清醒,我们都希望终止进程能够通知其父进程它是如何终止的。对于三个终止函数(exit\_exit\_Exit),实现这一点的方法是,将其退出状态(exit status)作为参数传送给函数。在异常终止情况下,内核(不是进程本身)产生一个指示其异常终止原因的终止状态(terminatio statu)。在任意一种情况下,该终止进程的父进程都能用wait或waitpid函数取得其终止状态。
退出api
#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);
代码演示:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int cnt=0;
pid=vfork();
if(pid>0){
while(1){
printf("cnt=%d\n",cnt);
printf("this is father print%d\n",getpid());
sleep(1);
}
}
if(pid==0){
while(1){
printf("this is child print,pid=%d\n",getpid());
sleep(1);
cnt++;
if(cnt==3){
//break;
//exit(0);
//_exit(0);
_Exit(0);
}
}
}
return 0;
}
进程退出调用(exit\_exit\_Exit)函数,尽量调用exit函数,调用后会对子进程调用的数据进行一下冲刷处理再退出,_exit\_Exit是直接退出