WEXITSTATUS与WIFEXITED

WEXITSTATUS与WIFEXITEDwait 的函数原型是 include nbsp nbsp include nbsp pid twait int nbsp status 进程一旦调用了 wait 就立即阻塞自己 由 wait 自动分析是否当前进程的某个子进程已经退出 如果让它找到了这样一个已经变成僵尸的子进程 wait 就会收集这个子进程的信息 并把它彻底销毁后返回 如果没有找到这样一个子进程 wait 就会一直阻塞在这里 直到有一个出现

wait()的函数原型是:
#include 

 

#include

 

pid_t wait(int *status)


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


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


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


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


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


#include

#include

#include

#include

#include

void f(){
printf(“THIS MESSAGE WAS SENT BY PARENT PROCESS..\n”);
}


main(){
int i,childid,status=1,c=1;
signal(SIGUSR1,f); //setup the signal value
i=fork(); //better if it was: while((i=fork)==-1);
if (i){
printf(“Parent: This is the PARENT ID == %d\n”,getpid());
sleep(3);
printf(“Parent: Sending signal..\n”);
kill(i,SIGUSR1); //send the signal


//status is the return code of the child process
wait(&status);
printf(“Parent is over..status == %d\n”,status);


//WIFEXITED return non-zero if child exited normally 
printf(“Parent: WIFEXITED(status) == %d\n”,WIFEXITED(status));


//WEXITSTATUS get the return code
printf(“Parent: The return code WEXITSTATUS(status) == %d\n”,WEXITSTATUS(status));
} else {
printf(“Child: This is the CHILD ID == %d\n”,getpid());
while(c<5){
sleep(1);
printf(“CHLID TIMER: %d\n”,c);
c++;
}
printf(“Child is over..\n”);
exit(2);
}
}


输出:
Child: This is the CHILD ID == 8158
Parent: This is the PARENT ID == 8157
CHLID TIMER: 1
CHLID TIMER: 2
Parent: Sending signal..
THIS MESSAGE WAS SENT BY PARENT PROCESS..
CHLID TIMER: 3
CHLID TIMER: 4
Child is over..
Parent is over..status == 512
Parent: WIFEXITED(status) == 1 //正常退出
Parent: The return code WEXITSTATUS(status) == 2 //拿到子进程返回值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202153.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午7:46
下一篇 2026年3月20日 上午7:46


相关推荐

  • android 退出APP

    android 退出APP在onCreate()中将Activity实例放到线性容器中,,,,退出时,一顿((Activity)list.gert(i)).finsh();存在的问题也是很明显的。。。保存了Activity的引用,是否会涉及,内存回收的问题。。。。(你得直到下面用的是强引用的方式哦。)packagecom.mystore.customer.act

    2022年7月17日
    24
  • Matlab方差分析

    Matlab方差分析Matlab 方差分析 T 检验 在工农业生产和科学研究中 经常遇到这样的问题 影响产品产量 质量的因素很多 我们需要了解在这众多的因素中 哪些因素对影响产品产量 质量有显著影响 为此 要先做试验 然后对测试的结果进行分析 方差分析就是分析测试结果的一种方法 在方差分析中 把在试验中变化的因素称为因子 用 A B C 表示 因子在试验中所取的不同状态称为水平 因子 A 的 r 个不同水平用 A1 A2

    2026年3月18日
    2
  • CMakeLists.txt 语法介绍与实例演练

    CMakeLists.txt 语法介绍与实例演练一、Cmake简介cmake是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。二、常用命令1.指定cmake的最小版本cmake_minimum_required(VERSION3.4.1)这行命令是可选的,我们可以不写这句话,但在有些情况下,如果CMakeLists.tx…

    2022年6月21日
    54
  • 保姆级部署指南——Mac/Windows双平台30分钟搞定OpenClaw

    保姆级部署指南——Mac/Windows双平台30分钟搞定OpenClaw

    2026年3月14日
    3
  • SDP简介

    SDP简介1 概述 SDP 制订的目的是描述多媒体会话 如会话通知 会话邀请或其他发起多媒体会话的形式 SDP 是纯粹的会话的描述格式而不是一个传输协议 它可以使用不同的传输协议 包括会话通知协议 SAP 会话初始协议 SIP 实时流协议 RTSP MIME 扩展协议的电子邮件以及超文本传输协议 HTTP SDP 并不描述广播地址的分配 或者详细的消息描述 并且 SDP 也不是为沟通媒体编解码而设计的 SDP 被设计

    2026年3月19日
    3
  • 51单片机最小系统的检查

    51单片机最小系统的检查以STC89C52为例(洞洞板、蚀刻板都要检查,工厂打板部分步骤可省略)准备:万用表(调至电压档),单片机最小系统(需供电)1.测量单片机供电是否正常51单片机的P20脚为GND,P40脚为VCC,红表笔接VCC,黑表笔接地:如果结果不为5V(2.6V或者其他),考虑是电源的问题。1.1首先检查电源线,红表笔接正极,黑表笔接负极,显示为5V左右,电源线正常。考虑是电路板的问题1.2将电压表调至通断档(红黑表笔短接电压表鸣叫)。首先检查GND连接是否…

    2022年6月23日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号