wait函数的demo
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
pid_t pid;
for(int i = 0; i<5;++i){
pid = fork();
if(pid == 0){
break;
}
}
if(pid > 0){
while (1)
{
printf("parent, pid = %d\n",getpid());
int st;
int ret = wait(&st);
if(ret == -1){
break;
}
if(WIFEXITED(st)){
printf("退出的状态:%d\n",WEXITSTATUS(st));
}
if(WIFSIGNALED(st)){
printf("被那个信号干掉了:%d\n",WTERMSIG(st));
}
printf("child die, pid = %d\n", ret);
sleep(1);
}
}
else if(pid == 0){
// while (1)
// {
printf("child, pid = %d\n",getpid());
sleep(1);
// }
exit(0);
}
}
waitpid函数的demo:
/*
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *wstatus, int options);
参数:
- pid :
pid > 0: 某个子进程的pid
pid = 0: 回收当前进程组的所有子进程
pid = -1:回收所有子进程
pid < -1:回收进程组id 为abs(pid)的所有子进程
- optinos:
0:阻塞
WNOHANG:非阻塞,调用waitpid的进程可以先干自己想干的事情
...
*/
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
pid_t pid;
for(int i = 0; i<5;++i){
pid = fork();
if(pid == 0){
break;
}
}
if(pid > 0){
while (1)
{
printf("parent, pid = %d\n",getpid());
sleep(1);
int st;
int ret = waitpid(-1,&st,WNOHANG);
if(ret == -1){
break;
}
else if(ret == 0){
//还有子进程存在
continue;
}
else if(ret > 0){
if(WIFEXITED(st)){
printf("退出的状态:%d\n",WEXITSTATUS(st));
}
if(WIFSIGNALED(st)){
printf("被那个信号干掉了:%d\n",WTERMSIG(st));
}
}
printf("child die, pid = %d\n", ret);
}
}
else if(pid == 0){
while (1)
{
printf("child, pid = %d\n",getpid());
sleep(1);
}
exit(0);
}
return 0;
}