fork
僵尸进程
进程终止,PCB残留,父进程未回收。
由于终止和回收不是并行的,所以所有进程都有这个状态,但是CPU运行速度很快,这个过程很短暂。
孤儿进程
父进程终止,子进程进孤儿院(init)
循环创建子进程
int main()
{
pid_t pid;
int i;
for(i =0; i< 5; i++){
pid = fork();
if(pid == 0){ //子进程直接退出
break;
}
}
if(i == 5){
//父进程
}else if(i == 0){
//第一个子进程
}else if(i == 1){
//第二个子进程
}else if(i == 2){
//第三个子进程
}else if(i == 3){
//第四个子进程
}else(i == 4){
//第五个子进程
}
return 0;
}
不同:
- 进程ID
- fork的返回值
- 进程运行时间
- 定时器
- 未决信号集
共享:
- 文件描述符
- mmap建立的映射区
读时共享,写实复制:
- 全局变量
gdb调试
set follow-fork-mode child
跟踪子线程
set follow-fork-mode parent
exec函数族
命名规律:
l:命令行参数的列表
p:使用PATH环境变量
v:命令行参数的数组
作用:
执行指定新程序。进程ID不变,代码段和数据段被新程序替换。
exec
execpl
使用PATH环境变量加载新程序
execl
使用指定路径加载新程序
返回:
成功,不返回
失败,返回-1设置errno
回收子进程
pid_t wait(int *wstatus)
作用:
阻塞等待子进程退出
回收子进程创建资源
获取子进程退出状态
参数:status(传出参数)
进程正常退出:
WIFEXITED(status) 为真,
WEXITSTATUS获取退出状态
异常终止:
WIFSIGNALED(status)为真
WTERMSIG(status)获取使之异常终止的信号
返回值:
成功,返回回收子进程ID
失败,返回-1,设置errno
pid_t waitpid(pid_t pid,int *wstatus,int options)
作用:
指定回收进程
可设置非阻塞状态
参数:
参一:>0 回收指定子进程; -1 回收任意子进程
参二:status
参三:WNOHANG,非阻塞。
返回值
大于0, 成功清理子进程ID
等于0,参数为WNOHANG,且没有子进程终止
-1,清理失败
注意
- 只能回收子进程,孙子进程不能
- 一次只能回收一个子进程,多次回收需要while循环。