进程退出
正常退出
1、Main函数调用return
2、进程调用exit(),标准c库
3、进程调用_exit()或者_Exit(),属于系统调用
补充:
进程最后一个线程返回
最后一个线程调用pthread_exit
异常退出
1、调用abort
2、当进程收到某些信号时,如ctrl+C
3、最后一个线程对取消(cancellation)请求做出响应
NAME
exit - cause normal process termination
SYNOPSIS
#include <stdlib.h>
void exit(int status);
NAME
_exit, _Exit - terminate the calling process
SYNOPSIS
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);
为啥要等待子进程退出?
1、僵尸进程,造成内存泄漏
2、父进程得管理子进程,所以父进程派给子进程的任务完成的如何,我们都需要知道
3、父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息
父进程等待子进程退出,并收集子进程的退出状态
子进程退出状态不被收集,变成僵死进程(僵尸进程)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.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,pid=%d\n",getpid());
sleep(1);
}
}
else if(pid==0)
{
while(1){
printf("this is child print,child pid=%d\n",getpid());
sleep(1);
cnt++;
if(cnt==3){
exit(0);
}
}
}
return 0;
}
相关函数
NAME
wait, waitpid, waitid - wait for process to change state
SYNOPSIS
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
区别:
waip使调用者阻塞,waitpid有一个选项,可以使调用者不阻塞
status参数:
是一个整型数指针
非空:子进程退出状态放在它所指向的地址中。
空:不关心退出状态
孤儿进程
父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程
Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程
运行结果