Linux 子进程限制,linux进程控制-waitpid()

waitpid系统调用在Linux函数库中的原型是:

#include

#include

pid_t waitpid(pid_t pid,int *status,int options)

从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。下面我们就来详细介绍一下这两个参数:

从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。

pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。

pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。

pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。

pid

options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:

ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);

如果我们不想使用它们,也可以把options设为0,如:

ret=waitpid(-1,NULL,0);

如果使用了WNOHANG(wait no

hung)参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。

而WUNTRACED参数,由于涉及到一些跟踪调试方面的知识,加之极少用到,这里就不多费笔墨了,有兴趣的读者可以自行查阅相关材料。

wait不就是经过包装的waitpid吗?没错,察看/include/unistd.h文件349-352行就会发现以下程序段:

static inline pid_t wait(int * wait_stat)

{

return waitpid(-1,wait_stat,0);

}

waitpid的返回值比wait稍微复杂一些,一共有3种情况:

当正常返回的时候,waitpid返回收集到的子进程的进程ID;

如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD;

#include

#include

#include

main()

{

pid_t pc, pr;

pc=fork();

if(pc<0) printf("Error occured on forking.\n");

else if(pc==0)

{ sleep(4); 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 release child %d\n", pr);

else

printf("some error occured\n");

}

编译并运行:

$ cc waitpid.c -o waitpid

$ ./waitpid

No child exited

No child exited

No child exited

No child exited

successfully release child 1526

父进程经过4次失败的尝试之后,终于收集到了退出的子进程。

因为这只是一个例子程序,不便写得太复杂,所以我们就让父进程和子进程分别睡眠了4秒钟和1秒钟,代表它们分别作了4秒钟和1秒钟的工作。父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它.这样的话,既不影响父进程的工作,也可以消除僵尸进程.

最后 不管是 wait

还是waitpid函数都有个参数来反映子进程的结束状态,底下有几个宏可判别结束情况,参数当然是指针指向的那个:

WIFEXITED(status)如果子进程正常结束则为非0 值。

WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED

来判断是否正常结束才能使用此宏。

WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真

WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED

来判断后才使用此宏。

WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED

时才会有此情况。

WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED

来判断后才使用此宏。

返回值

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回

-1。失败原因存于errno 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 docker 构建分布式调用链跟踪框架skywalking

一旦你的程序docker化之后,你会遇到各种问题&#xff0c;比如原来采用的本地记日志的方式就不再方便了&#xff0c;虽然你可以挂载到宿主机&#xff0c;但你使用 --scale 的话&#xff0c;会导致记录日志异常&#xff0c;所以最好的方式还是要做日志中心化&#xff0c;另一个问…

excel同一单元格怎么换行_excel表格内怎么换行 方法有两种 一看就会 新手教程...

很多人在用excel表格的时候都需要用到换行&#xff0c;但是有一些小伙伴还不知道如何去换行。今天就介绍两种单元格内换行的方法&#xff0c;这两种换行方式的效果不一样&#xff0c;大家可以根据自己的需求来选择使用哪种换行方式。方法一&#xff1a;单元格内自动换行操作&am…

Linux系统语言教程,Linux操作系统基础及语言基础教程-麦可网张凌华

本教程共43讲&#xff0c;主要讲解了计算机组成原理概述、Linux基础及操作系统框架、Shell命令机制、Linux命令类库机制及常用命令、Linux应用程序安装及卸载、Linux服务程序的安装及配置、Vi的设计思想及使用、shell脚本等内容&#xff0c;由于章节较多&#xff0c;本教程仅提…

持续交付一:从开发到上线的环境

团队开发中&#xff0c;开发&#xff0c;测试&#xff0c;预发布&#xff0c;生产&#xff0c;不同的角色工作在不同的环境中&#xff0c;不同的环境有不同的作用(有些公司的环境更多&#xff0c;按照自己的交付流程设计)&#xff0c;当然不同的环境&#xff0c;配置也不能相同…

linux远程登录命令rlogin,Linux rlogin命令

Linux rlogin命令Linux rlogin命令用于远端登入。执行rlogin指令开启终端机阶段操作&#xff0c;并登入远端主机。语法rlogin [-8EL][-e ][-l ][主机名称或IP地址]必要参数&#xff1a;-E 忽略escape字符-8 只识别8位字的字符-L 允许rlogin会话运行在litout模式-ec 设置escape字…

win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少

不知不觉&#xff0c;Win10与我们相伴已经整整四个年头了&#xff0c;从最开始的组团抗拒到现在的默默接受&#xff0c;个中滋味相信谁心里都有个数。近日微软开始推送“Win10更新五月版”&#xff0c;那么Win10中到底都有哪些“骚”操作&#xff1f;一起来看看吧。1、夜间模式…

C# 中的数字分隔符 _

编写 C# 代码时&#xff0c;我们时常会用到很大的数字&#xff0c;例如下面定义的变量&#xff1a;const long loops 50000000000;您能快速读出这是多少吗&#xff1f;是不是还是会有很多人把光标定位到最后一位&#xff0c;然后按键盘上的向左键一个一个往上数&#xff1a;个…

linux退出lftp命令,lftp命令使用

刚进入linux殿堂的人似乎总会尝试寻找一个类似FlashFXP或Leapftp的图形界面的ftp客户端&#xff0c;可是尝试过的朋友应该都清楚&#xff1a;不管是自由的&#xff0c;还是商业的ftp客户端&#xff0c;用来用去总还是不如lftp来得方便。没有图形界面&#xff0c;对于初学者来说…

数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...

空间光调制器(SLM), 空间光调制器(SLM)工作原理是什么?实时空间光调制器使得相干处理系统能输入非相干光图像和随时间变化的图像的器件。相干光处理系统的最大优点是二维平行处理、信息容量大&#xff0c;运算速度快。但是目前的输入图像和空间滤波都用银盐胶片作记录媒质&…

ZZ014城市轨道交通运营与维护赛题第9套

ZZ014城市轨道交通运营与维护赛题第&#xff19;套 模块1赛题 模块序号 模块1 对应赛项编号 ZZ014 模块名称 城市轨道交通运营服务 子任务数量 12 竞赛时间 60分钟 任务描述 行车组织作业、票务设备故障处置以及突发事件应急处理 职业要素 R基本专业素养 R专业实…

使用 .NET 5 体验大数据和机器学习

2020 中国.NET 开发者峰会正式启动 &#xff0c;欢迎大家提交演讲主题或者购买超级早鸟票。翻译&#xff1a;精致码农-王亮原文&#xff1a;http://dwz.win/XnM.NET 5 旨在提供统一的运行时和框架&#xff0c;使其在各平台都有统一的运行时行为和开发体验。微软发布了与 .NET 协…

linux监控目录容量,利用ZABBIX监控某个目录大小

近期&#xff0c;因为JMS的消息堆积导致ApacheMQ频率故障(消息没有被消费掉&#xff0c;导致其数据库达到1.2G&#xff0c;JMS此时直接挂掉)&#xff0c;很是郁闷&#xff01;刚好自己在研究zabbix.既然zabbix如此强大&#xff0c;那么它可以监控我的这个目录大小吗&#xff1f…

三菱plc选型手册_模拟量是什么?PLC和模拟量是如何转换的?

模拟量在PLC系统中有着非常广泛的应用&#xff0c;特别是在过程控制系统中。模拟量是一种连续变化的量&#xff0c;因此&#xff0c;它的使用对象也是各种连续变化的量&#xff0c;比如温度&#xff0c;压力&#xff0c;湿度&#xff0c;流量&#xff0c;转速&#xff0c;电流&…

FreeSql接入CAP的实践

CAPCAP 是一个基于 .NET Standard 的 C# 库&#xff0c;它是一种处理分布式事务的解决方案&#xff0c;同样具有 EventBus 的功能&#xff0c;它具有轻量级、易使用、高性能等特点。https://github.com/dotnetcore/CAPADO.NET事务1.DotNetCore.CAP.MySql中引用 了如下类库.在Co…

windows和linux命令行一样吗,微软改进Windows命令行 目的是和Linux命令行相抗衡

微软官方人员承认微软正在对Windows命令行环境或是Windows终端进行全方位的改进&#xff0c;目的是能和Linux命令行相竞争。随着Linux云服务器的大量被采用&#xff0c;很多Linux云服务器都没有安装图形界面&#xff0c;只使用终端能够大幅度提高运行速度&#xff0c;微软想通过…

vue 离开页面事件_【必看】58 道 Vue 常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度...

△ 是新朋友吗&#xff1f;记得先点web前端学习圈关注我哦&#xff5e;1.vue优点&#xff1f;答&#xff1a;轻量级框架&#xff1a;只关注视图层&#xff0c;是一个构建数据的视图集合&#xff0c;大小只有几十 kb &#xff1b;简单易学&#xff1a;国人开发&#xff0c;中文文…

购票啦 | 2020中国.NET开发者峰会启动

.NET Conf China 2020去年2019年在上海举行了第一届的中国.NET开发者峰会&#xff0c;今年2020年即将在苏州举行第二届&#xff0c;有兴趣的童鞋们&#xff0c;不要忘记购票参加哈。 1大会背景介绍2014年微软组织并成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路…

w7下如何安装linux双系统,ubuntu安装教程(下): 教你装win7+Ubuntu双系统

今天突发的想装个双系统玩玩&#xff0c;原来我ubuntu和win8都是装在虚拟机里面的&#xff0c;感觉用起来很不方便&#xff0c;而且感觉用起来特别不流畅&#xff0c;所以就想装个win7ubuntu的双系统。原来是想把ubuntu直接wubi安装在win7里面。但是这样的话&#xff0c;会带来…

vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期

代码编辑器或者文本编辑器相信大家都不会陌生&#xff0c;但是&#xff0c;常用Windows的朋友大概都知道其自带的“文本编辑器”那是一款多么难用的软件。后来又有一系列的编辑器&#xff0c;比如notepad、sublime、atom等等&#xff0c;包括Linux用户喜欢的vim&#xff0c;这些…

简单理解线程同步上下文

为了线程安全&#xff0c;winform和wpf框架中规定只能使用UI线程操作控件&#xff0c;从其它线程上操作控件就会报跨线程异常。假如有这样一个场景&#xff1a;点击按纽&#xff0c;然后开始计算员工薪资&#xff0c;并将计算信息实时展示在一个文本框中&#xff0c;由于计算过…