
wait函数
/*
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
功能:等待任意一个子进程结束,如果子进程结束或者中断了,那么就回收他的资源
参数: wstatus
进程退出时的状态信息,传入的是一个int类型的地址,传出参数
返回值:
成功:返回了被回收的子进程的ID
失败:-1(所有的子进程结束了,调用函数失败了)
调用wait函数的进程会被挂起(阻塞),知道他的一个子进程退出或者收到一个不能被忽略的信号才被唤醒
如果没有子进程,函数立刻返回-1,如果子进程全部结束,也返回-1
*/
#include<sys/wait.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.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("父, pid = %d\n", getpid());
int ret = wait(NULL);
printf("child die, pid = %d", ret);
sleep(1);
}
}
else if(pid == 0) {
while(1) {
printf("儿, pid = %d \n", getpid());
sleep(1);
}
}
}

bash
#include<sys/wait.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.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("父, pid = %d\n", getpid());
// int ret = wait(NULL);
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", ret);
sleep(1);
}
}
else if(pid == 0) {
//while(1) {
printf("儿, pid = %d \n", getpid());
sleep(1);
//}
exit(0);
}
}
因为exit(0)所以退出的状态码0 如果exit(2)那么就是2
如果通过kill -9 杀死进程 那么宏WIFSIGNALED就生效 输出那句话
waitpid函数
cpp
/*
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:等待任意一个子进程结束,如果子进程结束或者中断了,那么就回收他的资源
参数:
pid:
pid > 0:某个子进程的pid
pid = 0:回收当前进程组的所有子进程
pid = -1:回收所有的子进程 相当于wait()
pid < -1: 某个进程组的组id的绝对值,回收指定进程组中的子进程
wstatus
进程退出时的状态信息,传入的是一个int类型的地址,传出参数
options:
0:表示阻塞的
WNOHANG:非阻塞
返回值:
> 0:返回了子进程的ID
= 0:options = WNOHANG, 表示还有子进程活着
= -1;表示错误或者没有子进程
调用wait函数的进程会被挂起(阻塞),知道他的一个子进程退出或者收到一个不能被忽略的信号才被唤醒
如果没有子进程,函数立刻返回-1,如果子进程全部结束,也返回-1
*/
#include<sys/wait.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main() {
pid_t pid;
for(int i = 0; i < 5; i++) {
pid = fork();
if(pid == 0) {
break;
}
}
if(pid > 0) {
while(1) {
sleep(1);
printf("父, pid = %d\n", getpid());
// int ret = wait(NULL);
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", ret);
}
}
}
else if(pid == 0) {
while(1) {
printf("儿, pid = %d \n", getpid());
sleep(1);
}
exit(0);
}
}