Linux wait 用法

【linuxC语言】vfork、wait与waitpid函数 在Linux系统编程中,vfork()、wait() 和 waitpid() 函数是处理进程管理和控制流的重要工具。这些函数允许我们创建新进程、等待子进程结束并获取其退出状态,从而实现进程间的协作和管理。在本文中,我们探讨了 vfork()、wait() 和 waitpid() 函数在Linux C语言编程中的应用。vfork() 函数类似于 fork(),但是与 fork() 不同的是,它在子进程中共享父进程的地址空间,这样可以减少资源消耗。 阅读详情

Linux中wait用法:

系统中的僵尸进程都要由wait系统调用来回收。

函数原型:

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int *status);

进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就像下面这样:

pid = wait(NULL);

如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

例子:

/*wait.c*/

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

     

int main()

{

       pid_t pc, pr;

     

       pc = fork();

       if ( pc < 0 ) /* 如果出错 */

  {

         printf("create child prcocess error: %s/n", strerror(errno));

         exit(1);

  }

       else if ( pc == 0) /* 如果是子进程 */

       {

         printf("I am child process with pid %d /n", getpid());

         sleep(3);/* 睡眠3秒钟 */

         exit(0);

  }

       else /* 如果是父进程 */

       {

         printf("Now in parent process, pid = %d/n", getpid());

         printf("I am waiting child process to exit./n");

         pr = wait(NULL); /* 在这里等待子进程结束 */

         if ( pr > 0 ) /*子进程正常返回*/

         {

           printf("I catched a child process with pid of %d/n", pr);

         }

     else /*出错*/

     {

           printf("error: %s/n./n", strerror(errno));

         }

       }

       exit(0);

}

编译并运行:

[root@super liuxl]# gcc wait.c -o wait

 [root@super liuxl]# ./wait

I am child process with pid 20129

Now in parent process, pid = 20128

I am waiting child process to exit.

I catched a child process with pid of 20129

可以明显注意到,在第2行结果打印出来前有10秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去。

如果参数status的值不是NULL,wait就会把子进程退出时的状态取出并存入其中, 这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。由于这些信息 被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作,下面我们来学习一下其中最常用的两个:

1,WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。

(请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数–指向整数的指针status,而是那个指针所指向的整数,切记不要搞混了。)

2, WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。

例子:

/*wait2.c*/

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

    

int main()

{

      int status;

      pid_t pc, pr;

    

      pc = fork();

      if ( pc < 0) /* 如果出错 */

      {

        printf("error occured./n");

  }

      else if ( pc == 0 ) /* 子进程 */

      {

        printf("This is child process with pid of %d./n", getpid());

        exit(3); /* 子进程返回3 */

      }

      else /* 父进程 */

      {

        pr = wait(&status);

        if ( WIFEXITED(status) )   /* 如果WIFEXITED返回非零值 */

        {

          printf("The child process %d exit normally./n", pr);

          printf("the return code is %d./n", WEXITSTATUS(status));

        }

        else /* 如果WIFEXITED返回零 */

        {

          printf("The child process %d exit abnormally./n", pr);

    }

  }

      exit(0);

}

编译并运行:

[root@super liuxl]# gcc wait2.c -o wait2

[root@super liuxl]# ./wait2

This is child process with pid of 20253.

The child process 20253 exit normally.

the return code is 3.

父进程准确捕捉到了子进程的返回值3,并把它打印了出来。

当然,处理进程退出状态的宏并不止这两个,但它们当中的绝大部分在平时的编程中很少用到,有兴趣的读者可以参阅Linux man pages。

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/kaithelen/archive/2009/10/28/4737034.aspx

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考 本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。 阅读详情

相关推荐

libfacedetection 框架阅读及扩展经验

libfacedetection 框架源码解析与扩展心得1. libfacedetection 框架简介2. 源码解析2.1 facedetectcnn.h2.2 facedetectcnn.cpp2.3 facedetectcnn-model.cpp3. 其他层的扩展--depthwise convolution 前段时间因为工作需要,对libfacedetection框架做了些扩展,在阅读源...

weixin_42616332的博客 1500

linux——wait

文章目录前言一、wait函数二、例程1.wait()2.子进程退出状态3.异常退出 前言 本文记录的是wait的用法 一、wait函数 二、例程 1.wait() 代码如下(示例): #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(int argc, char const *argv[]) { int i..

weixin_43772611的博客 1506

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

Linux wait 命令介绍和使用案例详解整理

wait命令用于等待进程的完成。当在一个脚本中启动多个进程时,有时候需要确保某个进程执行完毕后再继续执行下一步操作。Linux中的wait命令是一个非常有用的工具,它用于在Shell脚本中生成并行执行的子进程。这样,wait命令就会等待进程ID为1234的进程执行完毕后再继续执行下一步操作。这样,wait命令会等待当前脚本启动的所有子进程执行完毕后再继续执行下一步操作。如果只想等待某个特定的进程结束,可以在wait命令后面指定进程ID。如果不指定进程ID,wait命令会等待所有子进程结束。

互联网那些事儿 1353

人工智能训练师认证教程(5)使用MONAI进行医学影像分析的完整指南

本文介绍了使用MONAI框架进行医学影像分析的全流程。首先详细说明了环境搭建步骤,包括PyTorch和MONAI的安装配置。然后以肺部CT 3D分割为例,分步骤讲解了数据准备与预处理、3D UNet模型构建、训练配置(DiceLoss损失函数、Adam优化器等)以及训练验证循环的实现。文章还包含推理可视化方法和模型导出为ONNX格式的部署方案,并强调了医学影像分析中的数据格式适配、强度归一化、显存优化等关键注意事项。最后指出MONAI的医学专用组件可大幅简化开发流程,建议后续可探索SwinUNETR等进阶方

华为开发者布道师,天府英才计划,致力于大数据+AI 的应用创新,助力企业与个人AI创新赋能。 1208

FPGA+CMV4000实战:从零搭建20fps成像系统的5个关键步骤(附避坑指南)

本文详细介绍了如何从零搭建基于FPGA和CMV4000传感器的20fps成像系统,涵盖硬件选型、SPI通信优化、LVDS数据采集、DDR2内存管理及系统集成等5个关键步骤。特别针对CMV4000传感器的SPI配置和高速数据处理的常见问题提供实用解决方案,帮助开发者避免常见陷阱,提升成像系统性能。

weixin_42628688的博客 427

Linux C语言 进程详解——fork()/wait()/waitpid()

从父进程(child1)和子进程(孙进程)的角度来推导,父进程(child1)就会和它的子进程同时执行进程(child1)的代码段。waitpid()不会阻塞父进程,父进程与子进程共同竞争资源,父进程完成后提前退出。如下运行结果可以证明进程的并发性和异步性,进程之间并发运行,且运行的顺序不定。父进程与子进程并发运行,且运行顺序不一定(可以调整循环次数观察结果)wait()会阻塞父进程,等待子进程全部结束后,父进程才开始运行。(1)在父进程中,fork返回新创建子进程的进程ID;一、fork()函数。

木牛的博客 748

Avellaneda & Stoikov模型实战解析:如何动态调整做市策略参数

本文深入解析Avellaneda & Stoikov模型在动态调整做市策略参数中的应用,重点探讨库存状态、剩余时间、风险系数和订单深度等核心参数的实战技巧。通过加密货币市场的实际案例,展示如何根据市场波动和流动性动态调整参数,提升做市策略的盈利能力和风险控制水平。

weixin_29070861的博客 202

Linux中wait用法

Linux中wait用法: 系统中的僵尸进程都要由wait系统调用来回收。 函数原型: #include #include pid_t wait(int *status); 进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进

longshengguoji的专栏 1698

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1136

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created..

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2775

linux中wait()用法,linux中waitpid及wait的用法

wait(等待子进程中断或结束)表头文件#include#include定义函数 pid_t wait (int * status);函数说明:wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,...

weixin_36073697的博客 1194

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux wait函数用法

ops_request_misc=%7B%22request%5Fid%22%3A%22170054928216800182745173%22%2C%22scm%22%3A%2220140713.130102334…函数是用于等待子进程结束并获取子进程的终止状态的系统调用。它在父进程中使用,用于等待其子进程终止并获得子进程的退出状态。是一个指向整型的指针,用于存储子进程终止时的退出状态,可以通过它获取子进程的退出状态。函数返回已终止子进程的进程ID,如果没有已终止的子进程,

田乐蒙的博客 547

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux wait用法

  Linux中wait的用法:   系统中的僵尸进程都要由wait系统调用来回收。   函数原型#include <sys/types.h>       #include <sys/wait.h>       pid_t wait(int *status);   进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经推出,如果让它找...

weixin_30328063的博客 146

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

linux中waitpid及wait的用法

linux中waitpid及wait的用法 wait(等待子进程中断或结束) 表头文件      #include      #include 定义函数 pid_t wait (int * status); 函数说明:     wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。     如果在调用 wait()时子进程

707

【转】linux中waitpid及wait的用法

原文网址:http://www.2cto.com/os/201203/124851.html wait(等待子进程中断或结束) 表头文件      #include&lt;sys/types.h&gt;      #include&lt;sys/wait.h&gt; 定义函数 pid_t wait (int * status); 函数说明:     wait()会暂时停止目前进程的执...

weixin_33824363的博客 83

Linux内核 -- 多线程之wait_event用法

条件可以是任意的逻辑表达式,通常是检查某些标志或变量的状态。

sz66cm 学习随笔 1956

Linux中wait用法注意

shell中,使用wait的各种注意事项

u010016196的专栏 2462

linux wait命令详解,讲解Linux系统中的Bash wait命令语法及用法示例

本文讲解Linux系统中Bash内置的wait命令、语法及wait命令实际用法示例。wait是等待给定作业完成并返回waited for命令的退出状态的命令,由于wait命令会影响当前的Shell执行环境,因此它在大多数Shell中都作为内置命令实现。Bash wait命令语法内置的wait一般语法采用以下形式:wait [options] IDID是流程或作业ID,如果未指定ID,则命令将等待直...

weixin_39704374的博客 1878

linux下wait、waitpid和waitid的用法

1.函数原型 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *wstatus); pid_t waitpid(pid_t pid, int *wstatus, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); 2.wait函数 wait函数会一直处于阻塞状态,直到有一个子进程退出,并返回退出子进

weixin_39270987的博客 2343

linux wait函数用法

【转自:http://hi.baidu.com/_hstyle/blog/item/fb7b12c4447390af8226acc5.html】     进程一旦调用了 wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一

xidianliusoftware的专栏 1299
上一篇: MTK(6225)定时器源代分析
下一篇: Eclipse 导入Android工程,中文注释乱码问题
刘启刚
博客等级 码龄18年 11粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值