进程的退出方式以及僵尸进程和孤儿进程

(1)正常退出
在这里插入图片描述(2)异常退出
在这里插入图片描述在这里插入图片描述
检查wait和waitpid所返回的终止状态的宏

说明
WIFEXITED(status)若为正常终止子进程返回的状态,则为真。对于这种情况可执行WEXITSTATUS(status),取子进程传送给exit、_exit或_Exit参数的低8位
WIFSIGNALED(status)若为异常终止子进程返回的状态,则为真(接到一个不捕捉的信号)。对于这种情况,可执行WTERMSIG (status),取使子进程终止的信号编号。另外,有些实现(非Single UNIX Specification)定义宏WCOREDUMP (staus),若已产生终止进程的core文件,则它返回真
WIFSTOPPED(status)若为当前暂停子进程的返回的状态,则为真。对于这种情况,可执行WSTOPSIG(status),取使子进程暂停的信号编号
WIFCONTINUED(status)若在作业控制暂停后已经继续的子进程返回了状态,则为真。(POSIX.1的XSI扩展,仅用于waitpid.)

(3)父进程等待子进程退出

pid_t wait(int *status);
解析子进程返回的状态码
status是一个整形数指针
非空:子进程退出状态放在它所指向的地址中
空:  不关心退出状态

        子进程状态不被收集会变成僵尸进程
僵尸进程:当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
        怎么查看僵尸进程:利用命令ps,可以看到有父进程ID为1的进程是孤儿进程;s(state)状态为Z的是僵尸进程。
        注意:孤儿进程(orphan process)是尚未终止但已停止(相当于前台挂起)的进程,但其父进程已经终止,由init收养;而僵尸进程则是已终止的进程,其父进程不一定终止。
在这里插入图片描述
status为NULL的代码示例

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{pid_t pid;pid=fork();int cnt;if(pid>0){while(1){wait(NULL);printf("this is father print,pid=%d\n",getpid());sleep(1);printf("cnt=%d\n",cnt);}}else if(pid==0){while(1){printf("this is child print,pid=%d\n",getpid());sleep(1);cnt++;if(cnt==5){exit(-1);}}}return 0;
}

status不为空的代码示例

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{pid_t pid;pid=fork();int status=10;int cnt;if(pid>0){while(1){wait(&status);printf("child quit,child status=%d\n",WEXITSTATUS(status));printf("this is father print,pid=%d\n",getpid());sleep(1);printf("cnt=%d\n",cnt);}}else if(pid==0){while(1){printf("this is child print,pid=%d\n",getpid());sleep(1);cnt++;if(cnt==5){exit(3);}}}return 0;
}

waitpid函数

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

对于waitpid函数中的pid参数的作用解释如下:
pid==-1 等待任意子进程,就这一方面而言,wait与waitpid等效。
pid>0 等待其进程ID与pid相等的子进程。
pid==0 等待其组ID等于调用进程组ID的任一子进程
pid<-1 等待其组ID等于pid绝对值的任一子进程
waitpid的options常量

常量说明
WCONTINUED若实现支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态尚未报告,则返回其状态(POSIX.1的XSI扩展)。
WNOHANG(常用,不挂起,不堵塞)如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
WUNTRACED若某实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,并且其状态自暂停以来还未报告过,则返回其状态。WIFSTOPPED宏确定返回值是否对应于一个暂停子进程。如果子进程进入暂停状态,则马上返回。

如果不想使用这些选项,则可以把这个参数设为0。
如果像这样调用waitpid函数:waitpid(-1, status, 0),这此时waitpid()函数就完全退化成了wait()函数。
代码示例

#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{pid_t pid;pid=fork();int status;int cnt;if(pid>0){while(1){waitpid(pid,&status,WNOHANG);printf("child quit,child status=%d\n",WEXITSTATUS(status));printf("this is father print,pid=%d\n",getpid());sleep(1);printf("cnt=%d\n",cnt);}}else if(pid==0){while(1){printf("this is child print,pid=%d\n",getpid());sleep(1);cnt++;if(cnt==5){exit(3);}}}return 0;
}

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

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

相关文章

java中的动态代理----自己手动实现

代码使用了common-io&#xff0c;需要其jar 1 接口 Java代码 public interface Pruduct { void selling(); } 2 书籍类 Java代码 public class Book implements Pruduct { Override public void selling() { try { Thread.sleep(1000…

Code Project精彩系列(1)

ApplicationsCrafting a C# forms Editor From scratchhttp://www.codeproject.com/csharp/SharpFormEditorDemo.asp建立一个类似C#的环境, 实现控件拖拉&#xff0c;属性Packet Capture and Analayzer网络封包截获http://www.codeproject.com/csharp/pacanal.aspA tool to cha…

linux进程---exec族函数(execl, execlp, execv, execvp, )解释和配合fork的使用

exec族函数函数的作用&#xff1a; exec函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件&#xff0c;也可以是任何L…

Code Project精彩系列(2)

Windows FormsFireball Resourcer把各种资源嵌入应用程序资源Window Hiding with C#隐藏窗体, 似乎是其它运行的窗体 JProper Threading in Winforms .NETWindows Forms User Settings in C#使用VS设置设定forms, coolA Pretty Good Splash Screen in C#一个自绘可爱屏幕A curt…

python bool值要注意的一些地方

1、像(),[],{}这三个是可以通过bool(()),bool([]),bool({})转化为bool值的&#xff1b;且它们转化后的结果为False。但是这三个值它本身并不等于False、切记不可以与False 直接进行比较。 #!/usr/bin/python #!coding:utf-8 import sysif __name__ "__main__":falseL…

system函数和popen函数使用方法

system int system(const char *command);system&#xff08;&#xff09;函数的返回值如下&#xff1a; 成功&#xff0c;则返回进程的状态值&#xff1b; 当sh不能执行时&#xff0c;返回127&#xff1b; 失败返回-1&#xff1b; 其实是封装后的exec&#xff0c;函数源代码在…

前端必备知识点—SVG

基本内容什么是SVG? 全称为Scalable Vector Graphics&#xff0c;是一种使用XML技术描述二维图形的语言&#xff0c;简单来说 - 矢量图(不失真)SVG与HTML5的关系早在HTML5之前,存在SVG技术SVG文件扩展名为".svg"在HTML5出现之前,要在HTML页面中引入SVG文件在HTML5出…

CocoaPods安装和使用及问题:Setting up CocoaPods master repo

CocoaPods是什么&#xff1f; 当你开发iOS应用时&#xff0c;会经常使用到很多第三方开源类库&#xff0c;比如JSONKit&#xff0c;AFNetWorking等等。可能某个类库又用到其他类库&#xff0c;所以要使用它&#xff0c;必须得另外下载其他类库&#xff0c;而其他类库又用到其他…

进程间的通信IPC(无名管道和命名管道)

进程间的通信IPC介绍 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。 IPC的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket…

那些关于浏览器的趣图和幽默段子

1、当浏览器化作一种枪&#xff0c;你喜欢用哪种呢&#xff1f;2、这神奇的反射弧&#xff0c;有点长…3、浏览器们成长的烦恼4、这么说来&#xff0c;IE浏览器扳回一分&#xff01;5、如何用浏览器区分 HTML和 HTML56、都在吹牛&#xff0c;还是IE最务实&#xff01;7、主流浏…

前端新手程序员不知道的 20个小技巧

1.作为前端开发者&#xff0c;使用双显示器能大幅提高开发效率。2.学编程最好的语言不是PHP&#xff0c;是English。3.东西交付之前偷偷测试一遍。4.问别人之前最好先自己百度&#xff0c;google一下&#xff0c;以免问出太低级的问题。5.把觉得不靠谱的需求放到最后做&#xf…

IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成

一、消息对列 消息队列&#xff0c;是消息的链接表&#xff0c;存放在内核中。一个消息队列由一个标识符&#xff08;即队列ID&#xff09;来标识。 特点&#xff1a; 消息队列是面向记录的&#xff0c;其中的消息具有特定的格式以及特定的优先级。消息队列独立于发送与接收进…

DBA十大必备工具(SQLServer)

曾经和一些DBA和数据库开发人员交流时&#xff0c;问他们都用过一些什么样的DB方面的工具&#xff0c;大部分人除了SSMS和Profile之外&#xff0c;基本就没有使用过其他工具了&#xff1b;诚然&#xff0c;SSMS和Profile足够强大&#xff0c;工作的大部分内容都能通过它们搞定&…

linux 信号和信号量编程

对于 Linux来说&#xff0c;实际信号是软中断&#xff0c;许多重要的程序都需要处理信号。信号&#xff0c;为 Linux 提供了一种处理异步事件的方法。比如&#xff0c;终端用户输入了 ctrlc 来中断程序&#xff0c;会通过信号机制停止一个程序。 信号概述 信号的名字和编号&…

安卓动画基础讲解

//逐帧动画 /** * 1.加入单张图片 * 2.生成movie.xml整个图片 * 3.代码中使用图片movie.xml */ iv(ImageView) findViewById(R.id.iv);// iv.setImageResource(R.drawable.movie);//为iv加载六张图片// AnimationDrawable ad(AnimationDrawable) iv.getDrawable();//得到图片给…

JS一些常用的类库

一、返回上一页&#xff08;history&#xff09;发觉有两种用法&#xff1a;1、javascript:history.back(-1);2、javascript:history.go(-1);它们俩的区别是&#xff1a;history.back(-1):直接返回当前页的上一页&#xff0c;数据全部消息&#xff0c;返回新页面history.go(-1)…

Linux上线程开发API概要(线程)

进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程&#xff1a;一个进程在同一时刻只做一件事情。有了多个控制线程后&#xff0c;在程序设计时可以把进程设计成在同一时刻做不止一件事&#xff0c;每个线程各自处理独立的任务。 进程是程序执行时的一个实例&…

Redis学习笔记1-Redis数据类型

Redis数据类型 Redis支持5种数据类型&#xff0c;它们描述如下&#xff1a; Strings - 字符串 字符串是 Redis 最基本的数据类型。Redis 字符串是二进制安全的&#xff0c;也就是说&#xff0c;一个 Redis 字符串可以包含任意类型的数据&#xff0c;一个字符串最大为 512M 字节…

30个非常有趣的404错误页面设计欣赏

当用户访问一个不存在的页面的时候就会出现404错误页面&#xff0c;这对用户来说是很不友好的。所以很多网站都会去设计一个新颖的错误页面&#xff0c;以吸引用户继续浏览其它的网页内容。今天这篇文章就收集了30个非常有趣的404错误页面设计欣赏&#xff0c;希望能带给你灵感…

线程同步之互斥量加锁解锁 死锁

与互斥锁相关API 互斥量&#xff08;mutex&#xff09;从本质上来说是一把锁&#xff0c;在访问共享资源前对互斥量进行加锁&#xff0c;在访问完成后释放互斥量上的锁。对互斥量进行加锁后&#xff0c;任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互…