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

告别C盘爆红!手把手教你将WSL2下的Ubuntu 22.04完整迁移到D盘(附清理指南) 本文详细指导如何将WSL2下的Ubuntu 22.04从C盘无损迁移到D盘,包括导出备份、注销原系统、导入新位置等关键步骤,并提供迁移后的优化配置、开发环境衔接及长期维护技巧,帮助用户彻底解决C盘空间不足问题。 阅读详情

相关推荐

MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)

   分析大脑解剖学差异最常用方法之一是基于体素的形态学方法(voxel-based morphometry, VBM)。 VBM的基本思想是测量大脑组织,尤其是灰质的局部浓度的差异。在大脑的每个体素处进行操作,然后在两个或多个实验组之间进行统计比较,从而在受调查的组之间建立特定大脑区域中脑组织浓度的统计学显着差异。 VBM分析基于(高分辨率)MRI脑部扫描,涉及大量处理步骤,主要是空间归一化,分割,平滑和统计分析,最终结果是统计图,显示了各组之间组织类型明显不同的区域[^1]。 参考 [^1] ..

意疏的学习笔记 3万+

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

实测对比:纳芯微NSD1624在光伏逆变器中的性能表现(含温度测试数据)

本文详细评测了纳芯微NSD1624非隔离驱动芯片在光伏逆变器中的性能表现,包括动态效率、高温稳定性及抗干扰能力。实测数据显示,该芯片在800V母线电压下效率峰值达99.03%,高温环境下结温稳定在102.7℃,且传播延迟一致性优异。与竞品相比,NSD1624在总损耗和热阻方面具有显著优势,是光伏逆变器驱动方案的理想选择。

weixin_29297127的博客 363

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

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

互联网那些事儿 1353

CTransformers: 高效的Python语言模型绑定库

CTransformers是一个为C/C++实现的Transformer模型提供Python绑定的开源库。它基于GGML库构建,旨在为开发者提供一种高效且易用的方式来在Python中使用各种流行的语言模型。支持多种流行的语言模型,如GPT-2、LLaMA、Falcon等提供统一的简单API接口支持GPU加速(CUDA和Metal)与Hugging Face Transformers和LangChain集成支持流式输出和嵌入计算。

helloaiworld的博客 1268

别再只玩积木了!用乐高EV3和官方软件,手把手教你做个能巡线的小车(附完整代码)

本文详细介绍了如何利用乐高EV3套件和官方软件制作智能巡线机器人,从硬件组装到软件编程全面覆盖。通过传感器原理讲解、控制算法调试等工程化细节,帮助读者掌握机器人开发的核心理念,特别适合STEAM教育和硬件编程爱好者实践。

weixin_30776273的博客 449

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

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

木牛的博客 748

FPGA赋能:从加权灰度均值到快速收敛的自动曝光实战

本文深入探讨了FPGA在工业视觉自动曝光算法中的应用,重点介绍了加权灰度均值法的优化实现与快速收敛策略。通过硬件友好的算法改造和流水线架构设计,FPGA方案能在1帧内完成曝光调整,显著提升处理速度和能效比,适用于复杂光照条件下的工业检测场景。

weixin_29306317的博客 82

Linux中wait用法

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

longshengguoji的专栏 1698

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1083

Android Audio录音——AudioRecord回声消除(九)

在语音通话或录音场景中,回声(Acoustic Echo)通常是指说话的声音从对方的扬声器播放出来,又被对方的麦克风拾取,然后有被传回来,导致我们听到了自己延迟了一段时间的重复声音。

小旭的专栏 1404

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

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

weixin_36073697的博客 1194

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

Linux wait函数用法

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

田乐蒙的博客 547

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux wait用法

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

weixin_30328063的博客 146

OV9734 DATASHEET,完整规格书

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

linux中waitpid及wait的用法

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

707

WINCC7.3破解文件

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

【转】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、付费专栏及课程。

余额充值