进程的终止
进程的终止分为两类,正常终止与异常终止
正常终止分为三种情况
正常终止
1.从main函数中返回可令进程终止
2.调用exit函数令进程终止
谁调谁死,在哪调在哪死
遇到exit(0)进程立马结束,后面的return 10,printf都不执行
退出处理函数也叫做遗言函数
程序正常结束,会冲刷打开状态的标准IO流,即输出缓冲区的内容到屏幕
程序中只是将doit注册成退出处理函数(atexit将函数地址交给内核),并没有自己调用,是内核调用的
void doit(int status,void* abc);status为退出码
on_exit(doit,&num);on_exit将函数的地址与num的地址给内核,进程结束时内核调用doit函数,内核将当前进程退出码与num地址给到doit完成传参
传地址给doit2,可以是数组地址,结构体地址。。。doit2就可以通过第二个参数void* arg接收任意类型任意数量个参数
先注册的后调用,后注册的后调用,所以doit2先调用,doit后调用
exit(10);退出码为10,status也可以拿到10
exit(1000);退出码为1000,给内核,内核将1000给退出处理函数doit2的status,还没有到父进程拿到的时候,程序结束时,内核会将1000存到进程的内存资源里,父进程给子进程收尸时/资源回收时只从内存资源里拿1个字节的退出码
3.调用_exit/_Exit函数令进程终止
exit内部会调用_exit
A,关文件描述符
B,将调用进程的所有子进程托付给孤儿院进程收养,给子进程托孤
C,给父进程打招呼,我要死了
D,终止进程,退出码存在它的资源里
直接调用_exit(status);虽然注册了退出处理函数,但不会执行ABC了
_Exit(status);同理
异常终止
1.