Linux系统调用之wait,waitpid函数(进程相关函数)
前言
如果,想要深入的学习Linux系统调用中的wait,waitpid函数,还是需要去自己阅读Linux系统中的帮助文档。
具体输入命令:
man 2 wait/waitpid
即可查阅到完整的资料信息。
wait函数
它是一个用于等待子进程结束的函数。该函数将暂停当前进程的执行,直到一个子进程结束或收到一个信号为止。当一个子进程结束时,wait函数会返回该子进程的PID(进程ID),并在status参数中返回子进程的退出状态信息。
wait函数的声明如下:
//需要引入的头文件
#include <sys/types.h>
#include <sys/wait.h>
//函数原型
pid_t wait(int *status);
功能:等待任意一个子进程结束,如果任意一个子进程结束了,次函数会回收子进程的资源。参数:int *wstatus进程退出时的状态信息,传入的是一个int类型的地址,传出参数。返回值:- 成功:返回被回收的子进程的id- 失败:-1 (所有的子进程都结束,调用函数失败)
调用wait函数的进程会被挂起(阻塞)
,直到它的一个子进程退出或者收到一个不能被忽略的信时才被唤醒
(相当于继续往下执行)。
如果没有子进程了,函数立刻返回,返回-1
;如果子进程都已经结束了,也会立即返回,返回-1
.
- 其中,pid_t是一个定义为int类型的数据类型,用于表示进程ID,而参数status是一个指向整数的指针,它是一个传出参数,用于保存子进程的退出状态信息。
退出信息相关宏函数
- WIFEXITED(status) 非0,进程正常退出
- WEXITSTATUS(status) 如果上宏为真,获取进程退出的状态(exit的参数)
- WIFSIGNALED(status) 非0,进程异常终止
- WTERMSIG(status) 如果上宏为真,获取使进程终止的信号编号
- WIFSTOPPED(status) 非0,进程处于暂停状态
- WSTOPSIG(status) 如果上宏为真,获取使进程暂停的信号的编号
- WIFCONTINUED(status) 非0,进程暂停后已经继续运行
下面是一个wait函数的示例代码:
代码示例:使用wait函数回收子进程资源,并打印进程退出状态
// 导入wait,getpid,fork函数的头文件
// pid_t wait(int *wstatus);
//pid_t fork(void);
//pid_t getpid(void);
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>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函数
waitpid()函数是一个用于等待子进程终止的系统调用。与wait()函数不同,waitpid()函数可以指定等待的进程ID,并且提供了更多的选项。
waitpid()函数的原型如下:
//需要引入的头文件,与wait函数相同
#include <sys/types.h>
#include <sys/wait.h>
//函数原型
pid_t waitpid(pid_t pid, int *status, int options);
其中,pid参数指定了要等待的子进程的进程ID,status参数是用于获取子进程的终止状态的指针,options参数指定了waitpid()函数的行为。
pid参数的取值可以有以下几种情况:
- pid > 0:等待进程ID为pid的子进程结束。
- pid == 0:等待与当前进程在同一个进程组中的所有子进程结束。
- pid == -1:等待任何一个子进程结束,与wait()函数相同。
- pid < -1:等待进程组ID为pid的所有子进程结束。
status参数是一个指向整型变量的指针,用于获取子进程的退出状态,这一点与wait函数相同。当waitpid()函数返回时,如果status不为NULL,则子进程的退出状态会被存储在status指向的变量中。如果status为空,则子进程的退出状态会被忽略。
options参数是一个控制waitpid()函数行为的标志位,它可以取以下值:
- WNOHANG:如果没有子进程结束,则立即返回0,不阻塞。
- WUNTRACED:如果子进程进入暂停状态,也立即返回。
- WCONTINUED:如果子进程恢复执行,则立即返回。
- WSTOPPED:等待任何一个子进程进入暂停状态。
- WEXITED:等待任何一个子进程结束。
- WNOWAIT:不删除已经结束子进程的进程表项,用于后续处理。
waitpid()函数返回值有以下几种情况:
- 返回结束子进程的进程ID。
- 如果WNOHANG标志被设置并且没有子进程结束,则返回0。
- 如果调用进程没有子进程,则返回-1,并设置errno为ECHILD。
- 如果调用被一个信号中断,则返回-1,并设置errno为EINTR。
总之,waitpid()函数是一个强大的进程管理函数,可以精确地控制进程的等待和处理。
下面是一个wait函数的示例代码:
代码示例:使用waitpid函数回收子进程资源,并打印进程退出状态
// 导入函数的头文件
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>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;
}
Linux系统调用之wait,waitpid函数(进程相关函数)相关推荐
- 8.6 wait和waitpid函数-进程控制
8.6 wait和waitpid函数-进程控制 当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核 ...
- linux ioctl root权限,Linux系统调用设备的ioctl函数
Linux系统调用设备的ioctl函数 在命令行调用设备的ioctl函数.在Linux系统中,似乎对设备的直接操作只有ioctl函数了.他接受的参数不是太多,而且都是一一对应的. blockdev - ...
- Linux系统调用-- recv/recvfrom/recvmsg函数详解(转)
Linux系统调用-- recv/recvfrom/recvmsg函数详解 2007-09-10 23:37 [recv/recvfrom/recvmsg系统调用] 功能描述: 从套接字上接收一个 ...
- Linux系统调用:创建和终止进程
1.进程的三种状态 1.运行.要么在被CPU执行,要么等待被执行且最终会被内核调度. 2.停止.执行被挂起且不会被调度.收到特定信号后才能继续运行. 3.终止.进程永远地停止了.可能的原因有三种:(1 ...
- Linux系统编程之waitpid函数详解
5.1 为什么要进行进程资源的回收 当一个子进程退出之后,该进程能够回收自己的用户区的资源,但是不能回收内核空间区的PCB(process control block 进程控制块)资源. (即:子进程 ...
- Linux系统调用--getrlimit()与setrlimit()函数详解【转】
转自:http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述: 获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制 ...
- Linux系统调用--getrlimit()与setrlimit()函数详解
功能描述: 获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值.非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转 ...
- Linux系统调用四、lseek()函数详解
- Linux系统调用二、open()函数与close()函数介绍
- Linux系统调用三、read()函数和write()函数介绍
最新文章
- Django高级管理静态文件和中间件5.1
- Tomcat+JSP经典配置实例
- [Java]java反射随笔
- 用冒泡法对10个整数从小到大排序
- cmake字符串转数组_JS 数组中你或许不知道的操作
- 怎么自动选中select中所有option
- 我用Python写了一个邮箱脚本发给班花,没想到事情闹大了...
- java判断端口是否可用
- B - 好数 51Nod - 1717
- android实现m3u8直播缓存/下载,M3U8Manger
- 数据仓库建模指南视频教程|数据仓库视频教程
- 用tikz画球坐标系下的体积微元
- linux数据异地备份,linux异地实时备份
- 实用工具(锐捷睿易篇)
- 米扑科技助力公益:寻找失踪儿童一起回家
- Speedoffice(excel)如何加粗边框线条
- Balance安装及用法小结
- 使用Eric构建使用Caffe应用程序
- 坑,爱转换PDF转换器,熊猫办公
- html中段落标志中标注文件子标题的是,html中段落标志中,标注文件子标题的是?()...
热门文章
- 常见网页错误代码说明
- Oracle外键约束reference,oracle外键约束
- 知识补充(原码、反码、补码)-- 一网打尽
- 专科考研,一个大专程序员的自我救赎
- 华为服务器欧拉系统怎么改ip,欧拉系统 启动服务命令
- 《网易公开课》也能被拿来练习python爬虫?离谱~
- 无法连接到 。 其他信息: 用户 ‘‘ 登录失败。 (Microsoft SQL Server,错误: 18456
- [漏洞扫描] Nessus,OpenVAS 漏洞扫描工具进行多维度的对比分析
- OpenFace简介
- 字符串拼接的加号问题