概述
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <sys/wait.h>
void sigchld(int signum){
//version 1.导致问题,若同时有三个子进程同时死亡,会丢失信号
//int r = wait(0);
//printf("%d process is recycledn",r);
//version 2.导致问题,wait等不到子进程会阻塞.影响父进程。
/*for(;;){
pid_t pid = wait(0);
if(pid == -1){
if(errno != ECHILD){
perror("wait");
exit(-1);
}
printf("all child process have been recycledn");
break;
}
printf("%d process is recycledn",pid);
}*/
//vesion 3解决1,2出现的问题
for(;;){
pid_t pid = waitpid(-1,0,WNOHANG);
if(pid == -1){
if(errno != ECHILD){
perror("waitpid");
exit(-1);
}
printf("all child process have been recycledn");
break;
}
if(pid){
printf("%d process was recycledn",pid);
}else{
break;
}
}
//for(;;)回收所有子进程,waitpid防止子进程不结束时候阻塞的情况.
}
int main(){
// signal(SIGCHLD,SIG_IGN);//第一种方法,直接忽略SIGCHLD信号
signal(SIGCHLD,sigchld);//第二种方法,自己写处理函数
pid_t pid = 0;
for(int i = 0;i < 3;++i){
pid = fork();
if(pid == -1){
perror("fork");
exit(-1);
}
if(pid == 0){
if(i == 2)
sleep(10);
printf("I am %u child process, I will dien",getpid());
return 0;
}
}
/*for(;;){
int ret = wait(0);
if(ret == -1){
if(errno != ECHILD){
perror("wait");
exit(-1);
}
printf("All child processes have been reclaimedn");
return 0;
}
printf("%d child process id recycledn",ret);
}*/
while(1){
printf("waiting...n");
sleep(1);
}
}
最后
以上就是时尚故事为你收集整理的回收子进程的两种方法的全部内容,希望文章能够帮你解决回收子进程的两种方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复