linux 进程等待 wait 、 waitpid
waitpid() 与 wait() 功能相似,都是用户主进程等待子进程结束或中断. 可用于进程之间的同步
wait 函数原型
pid_t wait(int *status);
函数说明
wait() 会临时停止眼下进程的运行,直到有信号来到或子进程结束.假设在调用wait() 时子进程已经结束,则 wait() 会立即返回子进程结束状态值.子进程的结束状态值会由參数 status 返回,而子进程的进程识别码也会一块返回.假设不在意结束状态值,则參数ststus能够设为 NULL.子进程的结束状态值请參考以下的waitpid().
返回值
假设运行成功则返回子进程识别码(PID), 假设有发生错误则返回 -1, 失败原因存于 errno 中.
演示样例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
pid_t pid;
int status, i;
if(fork() == 0) {
printf("This is the child process pid = %d\n",getpid());
exit(5);
} else {
sleep(1);
printf("This is the parent process , wait for child...\n");
pid = wait(&status);
i = WEXITSTATUS(status);
printf("child's pid = %d. exit status = %d\n", pid, i);
}
return 0;
}
waitpid 函数原型
pid_t waitpid(pid_t pid, int *status, int options);
函数说明
waitpid() 会临时停止眼下进程的运行,直到有信号来到或子进程结束. 假设在调用 waitpid() 时子进程已经结束,则 waitpid() 会立即返回子进程结束状态值. 子进程的结束状态值会由參数 status 返回,而子进程的进程识别码也会一块返回.假设不在意结束状态值,则參数ststus能够设为NULL.參数pid为欲等待的子进程识别码.其数值意义例如以下:
pid > 0 时,仅仅等待进程id等于pid的子进程,无论其他已经有多少子进程运行结束退出,仅仅要指定的子进程还没有结束,waitpid就会一直等下去.
pid = -1 时,等待不论什么一个子进程退出,没有不论什么限制,此时 waitpid 和 wait 的作用一模一样.
pid = 0 时,等待统一进程组中的不论什么子进程,假设子进程已经增加了别的进程组,waitpid 不会对它做不论什么理睬.
pid < -1 时, 等待一个指定进程组中的不论什么子进程,这个进程组的ID等于pid的绝对值。
參数 options 的值有以下几种类型:
WNOHANG 假设没有不论什么已经结束的子进程则立即返回, 不予以等待。
WUNTRACED 假设子进程进入暂停运行情况则立即返回,但结束状态不予以理会。
假设不用以上两个宏。还能够用 0 作为第三个參数传入。
注: wait() 函数就是经过包装的 waitpid(),查看 <内核源代码文件夹>/include/unistd.h 文件 就能够看到例如以下程序段
static inline pid_t wait(int *wait_stat)
{
return waitpid(-1,wait_stat,0);
}
返回值
当正常返回的时候 waitpid 返回收集到的子进程的ID;
假设设置了 WNOHANG, 而调用中waitpid 发现没有已退出的子进程可收集,则返回0;
假设调用中出错,则返回-1,并重置errno的值。
子进程的结束状返回后存于 status,地下有几个宏可判别结束情况
WNOHANG 假设没有不论什么已经结束的子进程则立即返回, 不予以等待。
WUNTRACED 假设子进程进入暂停运行情况则立即返回,但结束状态不予以理会。
子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
WIFEXITED(status)假设子进程正常结束则为非 0 值。
WEXITSTATUS(status)取得子进程 exit()返回的结束代码,通常会先用
WIFEXITED 来推断是否正常结束才干使用此宏。
WIFSIGNALED(status)假设子进程是由于信号而结束则此宏值为真
WTERMSIG(status) 取得子进程因信号而中止的信号代码,通常会先用 WIFSIGNALED 来推断后才使用此宏。
WIFSTOPPED(status) 假设子进程处于暂停运行情况则此宏值为真。
一般仅仅有使用 WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,通常会先用 WIFSTOPPED 来推断后才使用此宏。
演示样例代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pc, pr;
pc=fork();
if(pc<0)
printf("Error occured on forking.\n");
else if(pc==0) {
sleep(10);
exit(0);
}
do {
pr=waitpid(pc, NULL, WNOHANG);
if(pr==0) {
printf("No child exited\n");
sleep(1);
}
} while(pr==0);
if(pr==pc)
printf("successfully get child %d\n", pr);
else
printf("some error occured\n");
}
linux 进程等待 wait 、 waitpid的更多相关文章
- 父进程等待子进程结束 waitpid wait
我们一直在强调一个概念就是进程是一个程序执行的实例,是内核在虚拟概念下创建的实体,它实例化的体现在用户态就是程序代码和代码使用的变量(存储空间),在内核态就是内核为我们每个进程所保存的数据结构(状态信 ...
- linux进程及进程控制
Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划 ...
- Linux 进程
Linux 进程 在用户空间,进程是由进程标识符(PID)表示的.从用户的角度来看,一个 PID 是一个数字值,可惟一标识一个进程.一个 PID 在进程的整个生命期间不会更改,但 PID 可以在进程销 ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- linux 进程(二) --- 进程的创建及相关api
一.进程的创建fork()函数 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进程的返回值则是 新子进程的进 ...
- Linux 进程与信号的概念和操作
进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 信号与进程几乎控制了操作系统的每个任务. 在shell中输 ...
- c/c++ linux 进程 fork wait函数
linux 进程 fork wait函数 fork:创建子进程 wait:父进程等待子进程结束,并销毁子进程,如果父进程不调用wait函数,子进程就会一直留在linux内核中,变成了僵尸进程. for ...
- 【原创】访问Linux进程文件表导致系统异常复位的排查记录
前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需 ...
- Linux进程间的通信
一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟 ...
随机推荐
- [学习笔记]AJAX学习
AJAX学习 ——在w3cschool学习AJAX的学习笔记 参考网站:w3cschool XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支 ...
- OpenGL编程逐步深入(六)平移变换
准备知识 从这一节我们开始接触3D对象各种各样的变换,使其显示在屏幕上看起来有深度的感觉.通常每一种变换都是通过矩阵来实现的,把这些变换矩阵逐个的乘起来,然后用乘积乘以顶点位置.在每个教程中,我们致力 ...
- c# 对用户密码加密解密
一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 ? 1 2 3 4 5 6 7 8 9 10 11 12 /// <summary> /// 16位MD5加密 ...
- The IDL compiler
The IDL compiler or bindings generator transcompiles Web IDL to C++ code, specifically bindings betw ...
- linux傻瓜式安装lnmp
一.百度 https://lnmp.org/install.html 二.点击 <安装> 三.登录 linux cd /usr/local/ wget -c http://soft.vps ...
- Unity C# 设计模式(五)建造者模式
定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 组成部分: 1.Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造.这个接口规定要实现复杂对象的哪 ...
- C# Expression 树转化为SQL与语句(二)--解决参数问题
在用Expression解析的的时候碰到一些参数(不是具体的值),会出现这种情况. 在这里我们希望得到的是id=10,而不是id=m_id;那如何来解析这些参数? ================== ...
- mysql中lock tables与unlock tables(锁表/解锁)使用总结
php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(t ...
- ubuntu中开启、关闭防火墙
1.关闭ubuntu的防火墙 ufw disable 开启防火墙 ufw enable 2.卸载了iptables apt-get remove iptables 3.关闭 ...
- android内存释放处理
不知道大家对android内存释放都做什么样的处理,本人接触android不久,近期开发小游戏的过程中,由于游戏界面组件较多.刚玩游戏的时候感觉还好,可是重复进入游戏界面玩几次之后,游戏就会卡顿,我瞬 ...