进程回收
通过上节我们知道子进程退出后如果父进程不及时回收子进程会变成僵尸进程,那么父进程怎么回收已退出的子进程呢?
wait()和waitpid()函数
wait()函数
函数原型 pid_t wait( int *status);
ret: 成功:已回收进程的pid;
失败:-1;
功能:使用于父进程,等待(阻塞)一个子进程结束或该进程接到了一个指定的信号为止;
如果该父进程没有子进程或子进程已结束,那么wait()会返回-1;
代码
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(){
pid_t pid,ret;
pid = fork();
if(pid < 0){
perror("fork");
return 0;
}
else if(pid == 0){
printf("chile pid %d ppid %d pgid %d\n",getpid(),getppid(),getpgid(getpid()));
sleep(5);
//while(1);
exit(0);
}
else{
printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
ret = wait(NULL);
if(ret == -1){
printf("wait is failed\n");
}
else{
printf("wait pid:%d\n",ret);
}
while(1);
}
}
执行结果
由执行结果可见,利用wait()回收子进程后,就不会出现上节中出现的子进程成为僵尸进程情况了
waitpid()函数
函数原型 pid_t waitpid(pid_t pid,int *status,int option);
ret: >0:回收子进程的进程号;
=0:options 设置为WNOHANG且子进程没有退出;
-1:出错;
各参数功能:pid_t pid:pid > 0:回收进程号等于pid的子进程;
pid = -1:回收任何一个子进程;
pid = 0:回收其组id等于调用进程的组id的任何一个进程;
pid < -1:回收其组id等于pid的绝对值的任意子进程;
options: WNOHANG:若指定的pid没有退出不等待(阻塞)立即返回,返回值为0;
WUNTRACED:为了实现某种操作,有pid指定一个子进程已被暂停, 且
其状态还未报告过,则返回其状态;
0:和wait()一样;
当waitpid(-1,NULL,0)时作用与wait()一样。
代码
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(){
pid_t pid,ret;
pid = fork();
if(pid < 0){
perror("fork");
return 0;
}
else if(pid == 0){
printf("chile pid %d ppid %d pgid %d\n",getpid(),getppid(),getpgid(getpid()));
sleep(5);
//while(1);
exit(0);
}
else{
printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
ret = waitpid(-1,NULL,0);
if(ret == -1){
printf("wait is failed\n");
}
else{
printf("wait pid:%d\n",ret);
}
while(1);
}
}
执行结果
执行结果与wait()相同;
wait()是waitpid()的一个特例;