正常退出
1.main函数调用return
2.进程调用exit(),标准c库
3.进程调用_exit()或者_Exit,属于系统调用
补充
1.进程最后一个线程返回
2.最后一个线程调用pthread_exit
异常退出
1.调用abort
2.当进程收到某些信号时,如crtl+c
3.最后一个线程对取消(cancellation)请求做出响应
在任一情况下,该终止进程的父进程都能用wait或waitpid函数取得其终止状态
父进程等待子进程退出并且收集子进程的退出状态,子进程退出状态不被收集,变成僵尸进程(僵死进程)
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int cnt = 0;
int status = 10;
pid = fork();
if(pid>0){
wait(&status); // wait阻塞,等待收集子进程资源,所以先执行子进程------敲重点
//waitpid(pid,&stats,WNOHANG); //挂起状态,子父一起运行,不阻塞,会出现僵尸进程
printf("child quit,child status = %d\n",WEXITSTATUS(status)); //需要用宏解析status
while(1){
printf("cnt = %d\n",cnt);
printf("this is father print,pid = %d\n",getpid());
sleep(1);
}
}
else if(pid == 0){
while(1){
printf("this is chilid print,pid = %d\n",getpid());
sleep(1);
cnt++;
if(cnt == 5){
exit(3);
}
}
}
return 0;
}
孤儿进程:父进程如果不等待子进程退出,在子进程结束之前就结束了自己的“生命”,此时子进程叫做孤儿进程
Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
//孤儿进程
int main()
{
pid_t pid;
int cnt = 0;
int status = 10;
pid = fork();
if(pid>0){
printf("this is father print,pid = %d\n",getpid());
}
else if(pid == 0){
while(1){
printf("this is chilid print,pid = %d,my father pid = %d\n",getpid(),getppid());
sleep(1);
cnt++;
if(cnt == 5){
exit(3);
}
}
}
return 0;
}