【APUE】孤儿进程与僵死进程

基本概念:

在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

问题与危害

unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上

每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。因此孤儿进程并不会有什么危害。

孤儿进程与僵死进程示例

孤儿进程:

 

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>int main()
{pid_t pid;//创建一个进程pid = fork();//创建失败if (pid < 0){perror("fork error:");exit(1);}//子进程if (pid == 0){printf("I am the child process.\n");//输出进程ID和父进程IDprintf("pid: %d\tppid:%d\n",getpid(),getppid());printf("I will sleep five seconds.\n");//睡眠5s,保证父进程先退出sleep(5);printf("pid: %d\tppid:%d\n",getpid(),getppid());printf("child process is exited.\n");}//父进程else{printf("I am father process.\n");//父进程睡眠1s,保证子进程输出进程idsleep(1);printf("father process is  exited.\n");}return 0;
}

 

僵死进程:

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>int main()
{pid_t pid;pid = fork();if (pid < 0){perror("fork error:");exit(1);}else if (pid == 0){printf("I am child process.I am exiting.\n");exit(0);}printf("I am father process.I will sleep two seconds\n");//等待子进程先退出sleep(2);//输出进程信息system("ps -o pid,ppid,state,tty,command");printf("father process is exiting.\n");return 0;
}

 

 

僵死进程解决办法:

1)通过信号机制

子进程退出时向父进程发送SIGCHLD信号,父进程处理SIGCHLD信号。在信号处理函数中调用wait进行处理僵尸进程

2)fork两次

第一个child process创建子进程后自己退出,这样它的子进程变成孤儿进程。将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程

 

参考:

http://www.cnblogs.com/Anker/p/3271773.html

转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3873323.html

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

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

相关文章

一个DBA的工作写照

一个DBA的工作写照&#xff0c; 一个DBA的内心 Know the DBA Mind! DBA也是 IT民工啊&#xff0c; 民工何苦为难民工&#xff01; 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968227.html

使用mutex和条件变量实现信号量

c提供了互斥量&#xff1a;mutex和条件变量&#xff1a;condition_variable&#xff0c;但是并没有信号量&#xff1a;semaphore。而linux和windows系统库会提供的。下面简单介绍一下信号量的特性&#xff0c;然后给出一个简单的demo&#xff0c;使用mutex condition_variable…

2014-07-28 使用Axure RP进行手机端BBS的原型设计

今天是在吾索实习的第14天。因本公司的微信公众号需要有一个对外的技术交流平台&#xff0c;所以我们小组打算设计一个手机端的BBS以满足其要求。首先&#xff0c;我们需要做的是进行数据库设计与原型设计&#xff0c;然后提交给经理验收&#xff0c;看看是否合理&#xff0c;是…

jquery exif + lazyload实现延迟加载并显示相片exif信息

对一个摄影爱好者来说&#xff0c;从高手的作品中学习是非常有用的。而照片的光圈&#xff0c;快门&#xff0c;感光度等信息是关注的重点。 上代码&#xff1a; 1 <script src"../js/jquery.js" type"text/javascript"></script>2 <script…

undefined reference to `pthread_create‘(linux下Clion使用thread报错)

完整报错&#xff1a; [ Build | AsyncLogger | Debug ] /snap/clion/169/bin/cmake/linux/bin/cmake --build /home/dyy/CLionProjects/AsyncLogger/cmake-build-debug --target AsyncLogger -- -j 6 [ 50%] Linking CXX executable AsyncLogger /usr/bin/ld: CMakeFiles/Asy…

UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)

题意&#xff1a;给一个元素周期表的元素符号&#xff08;114种&#xff09;&#xff0c;再给一个串&#xff0c;问这个串能否有这些元素符号组成&#xff08;全为小写&#xff09;。 解法1&#xff1a;动态规划 定义&#xff1a;dp[i]表示到 i 这个字符为止&#xff0c;能否有…

.NET开发相关使用工具和框架【转载】

开发类 visual_studio 2005-2012系列----------语言开发工具 Visio 2003 / Power Desiger -----------建模工具 Dreamweaver_CS5 --------------网页设计 ExpressionStudio 4 / blend 4 -------------wpf/silverlight设计工具 开发辅助类 SVN 主程序 ---------------文件控制 I…

JAVA数组的定义及用法

数组是有序数据的集合&#xff0c;数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素。 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; 当中类型(type)能够为Java中随意的数据类型&#xff0c;包含简单类型组合类型&#xff0c;数组名…

php操作httpsqs

php初始化httpsqs: include_once("httpsqs_client.php");$httpsqs new httpsqs("127.0.0.1", 1218, "mypass123", "utf-8"); php操作httpsqs:常用命令 操作入队&#xff1a; $result $httpsqs->put(xiongwei2, test1); 获取队列中…

异步日志系统设计demo

目录简单版本1优化版本1优化版本2对于QPS要求很高或者对性能有一定要求的服务器程序&#xff0c;同步写日志会对服务的关键性逻辑的快速执行和及时响应带来一定的性能损失&#xff0c;因为写日志时等待磁盘IO完成工作也需要一定时间。为了减少这种损失&#xff0c;一般采用异步…

js unix时间戳转换

一、unix时间戳转普通时间&#xff1a; var unixtime1358932051; var unixTimestamp new Date(unixtime* 1000); commonTime unixTimestamp.toLocaleString(); alert("普通时间为&#xff1a;"commonTime); 二、普通时间转unix时间戳 var str "2013-01-01 00…

hdu 1025(最长非递减子序列的n*log(n)求法)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1025 经典题。。。最长非递减序列的n*log(n)求法。。。orz... View Code 1 #include<iostream>2 const int N500007;3 using namespace std;4 int city[N];5 int dp[N];//dp[i]保存的是长度为i的最长不降…

消息队列重要机制讲解以及MQ设计思路(kafka、rabbitmq、rocketmq)

目录《Kafka篇》简述kafka的架构设计原理&#xff08;入口点&#xff09;消息队列有哪些作用&#xff08;简单&#xff09;消息队列的优缺点&#xff0c;使用场景&#xff08;基础&#xff09;消息队列如何保证消息可靠传输死信队列是什么&#xff1f;延时队列是什么&#xff1…

js判断手机浏览器

最新浏览器识别合并。 demo&#xff1a;http://v.qq.com -> http://v.qq.com/h5    http://v.qq.com/ -> http://v.qq.com/h5    http://v.qq.com/h5 -> http://v.qq.com/h5 <script type"text/javascript"> (function(W){ …

数据库归档模式

1、在sys身份下登陆oracle&#xff0c;执行命令archive log list; SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence …

转载|网络编程中阻塞式函数的底层逻辑

逛知乎看到的&#xff0c;觉得写的挺透彻的&#xff0c;转载一下&#xff0c;原文链接&#xff1a;Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗&#xff1f; 原文以阻塞式的recv函数作为讲解&#xff0c;但是所有阻塞式的api底层逻辑基本相通。 下面是正文…

把txt文件中的json字符串写到plist文件中

- (void)json2Plist {NSString *filePath [self applicationDocumentsDirectoryFileName:"json"];NSMutableArray *tempArray [[NSMutableArray alloc] initWithContentsOfFile:filePath];//第一次添加数据时,数组为空if (tempArray.count 0) {tempArray [NSMuta…

树的存储结构2 - 数据结构和算法42

树的存储结构 让编程改变世界 Change the world by program 孩子表示法 我们这次换个角度来考虑&#xff0c;由于树中每个结点可能有多棵子树&#xff0c;可以考虑用多重链表来实现。 就像我们虽然有计划生育&#xff0c;但我们还是无法确保每个家庭只养育一个孩子的冲动&a…

海量数据去重

海量数据去重 一个文件中有40亿条数据&#xff0c;每条数据是一个32位的数字串&#xff0c;设计算法对其去重&#xff0c;相同的数字串仅保留一个&#xff0c;内存限制1G. 方法一&#xff1a;排序 对所有数字串进行排序&#xff0c;重复的数据传必然相邻&#xff0c;保留第一…

Sharepoint 2013 发布功能(Publishing features)

一、默认情况下&#xff0c;在创建网站集时&#xff0c;只有选择的模板为‘ Publishing Portal&#xff08;发布门户&#xff09;’与‘ Enterprise Wiki&#xff08;企业 Wiki&#xff09;’时才默认启用发布功能&#xff0c;如下图所示&#xff1a; 二、发布功能包含两块&…