waitpid函数

作用同于wait,但可指定pid进程清理,可以不阻塞。

pid_t waitpid(pid_t pid,int *status,int options);成功:返回清理掉的子进程ID;失败:-1(无子进程)

特殊参数和返回情况:

参数pid:

>0 回收指定ID的子进程

-1 回收任意子进程(相当于wait)

0 回收和当前调用waitpid一个组的所有子进程

< -1 回收指定进程组内的任意子进程

返回0:参数3为WNOHANG,且子进程正在运行。

注意:一次wait或waitpid调用只能清理一个子进程,清理多个子进程需要用到循环

/***
loop_wait.c
***/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> int main(int argc, char *argv[])
{
int n = , i; //默认创建5个子进程
pid_t p, q; if(argc == ){
n = atoi(argv[]);
} for(i = ; i < n; i++) {//出口1,父进程专用出口
p = fork();
if(p == ) {
break; //出口2,子进程出口,i不自增
} else if (i == ){
q = p;
}
} if(n == i){
sleep(n);
printf("I am parent, pid = %d\n", getpid(), getgid());
//pid_t pid = waitpid(q, NULL, WNOHANG);
// pid_t pid = wait(NULL);
//printf("child pid = %d\n", pid);
while(); } else {
sleep(i);
printf("I'm %dth child, pid = %d, gpid=%d\n",
i+, getpid(), getgid());
while();
} return ;
}
/***
waitpid.c
***/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h> int main(void)
{
pid_t pid, pid2, wpid;
int flg = ; pid = fork();
pid2 = fork(); if(pid == -){
perror("fork error");
exit();
} else if(pid == ){ //son
printf("I'm process child, pid = %d\n", getpid());
sleep();
exit();
} else { //parent
do {
wpid = waitpid(pid, NULL, WNOHANG);
//wpid = wait(NULL);
printf("---wpid = %d--------%d\n", wpid, flg++);
if(wpid == ){
printf("NO child exited\n");
sleep();
}
} while (wpid == ); //子进程不可回收 if(wpid == pid){ //回收了指定子进程
printf("I'm parent, I catched child process,"
"pid = %d\n", wpid);
} else {
printf("other...\n");
}
} return ;
}
/***
waitpid2.c
***/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h> int main(void)
{
pid_t pid, pid2, wpid;
int flg = ; pid = fork();
pid2 = fork(); if(pid == -){
perror("fork error");
exit();
} else if(pid == ){ //son
printf("I'm process child, pid = %d\n", getpid());
sleep();
exit();
} else { //parent
do {
wpid = waitpid(pid, NULL, WNOHANG);
//wpid = wait(NULL);
printf("---wpid = %d--------%d\n", wpid, flg++);
if(wpid == ){
printf("NO child exited\n");
sleep();
}
} while (wpid == ); //子进程不可回收 if(wpid == pid){ //回收了指定子进程
printf("I'm parent, I catched child process,"
"pid = %d\n", wpid);
} else {
printf("other...\n");
}
} return ;
}
/***
waitpid3.c
***/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> int main(int argc, char *argv[])
{
int n = , i;
pid_t p, q; if(argc == ){
n = atoi(argv[]);
}
q = getpid(); for(i = ; i < n; i++) {
p = fork();
if(p == ) {
break;
}
} if(n == i){ // parent
sleep(n);
printf("I am parent, pid = %d\n", getpid());
for (i = ; i < n; i++) {
p = waitpid(, NULL, WNOHANG);
printf("wait pid = %d\n", p);
}
} else {
sleep(i);
printf("I'm %dth child, pid = %d\n",
i+, getpid());
}
return ;
}

waitpid:

参1:    pid  > 0       指定进程id回收

pid = -1        回收任意子进程

pid = 0          回收本组任意子进程

pid < -1        回收该进程组的任意子进程

参2:    status:

返回:成功:pid  失败 -1

status:传出参数

1: 阻塞等待子进程

2: 回收子进程资源

3:    获取子进程结束状态:1)WIFEXITED()真

WEXITSTATUS()获取子进程退出状态

2)WIFSIGNALED() 真

WTERMSIG()获取导致子进程终止的信号的                                                                                           编码

参3:    0 :(wait)阻塞回收

WBNIOHANG:非阻塞回收(轮询)

返回值:       成功:pid  失败 -1  返回 0 值: 参3传WNOHANG,并且子进程尚未结束。

waitpid()函数的更多相关文章

  1. 进程控制之wait和waitpid函数

    当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号, ...

  2. waitpid 函数详解

    关于Linux中waitpid函数的一些使用说明: #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t waitpid( ...

  3. 用waitpid函数回收进程

    waitpid函数:作用同wait,但可指定pid进程清理,可以不阻塞. 原型:pid_t waitpid(pid_t pid, int *status, in options); 返回值:成功时返回 ...

  4. UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

    lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...

  5. wait/waitpid函数与僵尸进程、fork 2 times

    一.僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程, ...

  6. 【Linux】僵尸进程,孤儿进程以及wait函数,waitpid函数(有样例,分析很详细)

    本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进 ...

  7. wait函数与waitpid函数(僵尸进程)

    当子进程退出时,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程.它只保留最小的一些 ...

  8. wait 和waitpid函数对比-(转自 wintree)

    Wait和waipid函数 当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知.父进程可以选择忽略该信号,或者 ...

  9. linux多进/线程编程(3)——wait、waitpid函数和孤儿、僵尸进程

    当使用fork创建多个进程后,需要解决子进程回收的问题.wait和waitpid函数就是做这个工作的. 假设子进程没有合理的回收,可能会带来两个问题: 1.孤儿进程(父进程挂了,子进程活着),孤儿进程 ...

随机推荐

  1. javascript中var、let、const的区别

    这几天修改别人的js,发现声明变量有的用var,有的用let,那它们有什么区别呢? javascript中声明变量的方式有:var.let.const 1.var (1)作用域: 整个函数范围内,或者 ...

  2. zabbix 后台数据库清除数据

    alerts 表 problem 表 escalations 表 events 表  event_recovery表 对 这些表进行清除 防止不停发送邮件 -- alerts table rebuil ...

  3. PAT 1093

    The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...

  4. Delphi文字转语音TTS【支持选择语音库,播放,暂停,开始,停止,生成语音文件,设置音量,设置语速】

    作者QQ:(648437169) 点击下载➨文字转语音TTS [Delphi 文字转语音TTS]调用系统自带的TTS组件,支持XP,vista,win7,win8,win10系统,支持选择语音库,播放 ...

  5. SSM整合学习 二

    二:与Spring MVC整合 一:添加Spring MVC Framework 右键项目名称,点击Add Framework Support 选择Spring-Spring MVC框架 选择Down ...

  6. CLRS10.2-8练习 - 单指针值实现双向链表

    要求: Explain how to implement doubly linked lists using only one pointer value x.np peritem instead o ...

  7. 【leetcode-91 动态规划】 解码方法

    一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1 ...

  8. .net Dapper 实践系列(1) ---项目搭建(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 一.前期准备 1.在MySQL创建数据库 2.创建项目 3.安装程序包 4.添加插件 5.添加DbOption文件夹 6.添加实体类 写在前面 学习并实践使用Dapper 这个小型的O ...

  9. C# vb .net图像合成-合成艺术字 照片合成艺术字

    在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...

  10. springboot项目,打包时携带所有依赖

    springboot项目,打包时携带所有依赖 本文主要解决springboot打包时,如何设置才能把当前项目的所有依赖都打进去. Springboot 的自带spring-boot-maven-plu ...