如果,想要深入的学习Linux系统调用中的wait,waitpid函数,还是需要去自己阅读Linux系统中的帮助文档。
具体输入命令:
man 2 wait/waitpid
即可查阅到完整的资料信息。
它是一个用于等待子进程结束的函数。该函数将暂停当前进程的执行,直到一个子进程结束或收到一个信号为止。当一个子进程结束时,wait函数会返回该子进程的PID(进程ID),并在status参数中返回子进程的退出状态信息。
wait函数的声明如下:
//需要引入的头文件
#include
#include
//函数原型
pid_t wait(int *status);
功能:等待任意一个子进程结束,如果任意一个子进程结束了,次函数会回收子进程的资源。参数:int *wstatus进程退出时的状态信息,传入的是一个int类型的地址,传出参数。返回值:- 成功:返回被回收的子进程的id- 失败:-1 (所有的子进程都结束,调用函数失败)
调用wait函数的进程会被挂起(阻塞)
,直到它的一个子进程退出或者收到一个不能被忽略的信时才被唤醒
(相当于继续往下执行)。
如果没有子进程了,函数立刻返回,返回-1
;如果子进程都已经结束了,也会立即返回,返回-1
.
下面是一个wait函数的示例代码:
// 导入wait,getpid,fork函数的头文件
// pid_t wait(int *wstatus);
//pid_t fork(void);
//pid_t getpid(void);
#include
#include
#include
#include
#include int main(){pid_t pid;//循环产生5个子进程for(int i = 0; i < 5; ++i){pid = fork();if(pid == 0) break; //为了不让子进程再产生孙子进程,所以要break掉}if(pid > 0 ){while(1){printf("I am parent process, process id = %d\n",getpid());int st;int ret = wait(&st);if(ret == -1) break; //如果所有子进程死完了,则结束while循环if(WIFEXITED(st)) printf("子进程%d正常退出\n",ret);if(WIFSIGNALED(st)) printf("子进程被%d号信号干掉了\n",WTERMSIG(st));}}if(pid == 0){while(1){printf("I am child process, process id = %d\n",getpid());sleep(50);exit(0);}}printf("所有子进程已杀死\n");return 0;
}
我们可以通过 kill -9 加上进程号
去杀死其中的子进程,观察退出信息相关宏函数的输出内容。
waitpid()函数是一个用于等待子进程终止的系统调用。与wait()函数不同,waitpid()函数可以指定等待的进程ID,并且提供了更多的选项。
waitpid()函数的原型如下:
//需要引入的头文件,与wait函数相同
#include
#include
//函数原型
pid_t waitpid(pid_t pid, int *status, int options);
其中,pid参数指定了要等待的子进程的进程ID,status参数是用于获取子进程的终止状态的指针,options参数指定了waitpid()函数的行为。
pid参数的取值可以有以下几种情况:
status参数是一个指向整型变量的指针,用于获取子进程的退出状态,这一点与wait函数相同。当waitpid()函数返回时,如果status不为NULL,则子进程的退出状态会被存储在status指向的变量中。如果status为空,则子进程的退出状态会被忽略。
options参数是一个控制waitpid()函数行为的标志位,它可以取以下值:
waitpid()函数返回值有以下几种情况:
总之,waitpid()函数是一个强大的进程管理函数,可以精确地控制进程的等待和处理。
下面是一个wait函数的示例代码:
// 导入函数的头文件
#include
#include
#include
#include
#include int main(){pid_t pid;//循环产生5个子进程for(int i = 0; i < 5; ++i){pid = fork();if(pid == 0) break; //为了不让子进程再产生孙子进程,所以要break掉}if(pid > 0 ){while(1){printf("I am parent process, process id = %d\n",getpid());sleep(15);int st;//用来获取信号int ret = waitpid(-1,&st,WNOHANG);if(ret == -1){perror("waitpid");break; } if(ret == 0) continue;if(WIFEXITED(st)) printf("子进程%d正常退出\n",ret);if(WIFSIGNALED(st)) printf("子进程被%d号信号干掉了\n",WTERMSIG(st)); }}if(pid == 0){while(1){printf("I am child process, process id = %d\n",getpid());sleep(50);exit(0);}}return 0;
}
上一篇:最少砝码(思维+找规律)