当前位置: 首页 > 编程日记 > 正文

c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程

目录

1 前言

2 僵尸进程

2.1 进程简介

2.2 僵尸进程例子

2.3 僵尸进程危害

3 处理僵尸进程

3.1 kill 命令

3.2 kill 父进程

3.3 reboot

3.4 magic sysrq key 方法

1 前言

在 centos7 跑 Docker 和 k8s 时,偶尔会出现 systemctl 失效的情况,现象如下:Failed to get properties...

查看系统进程,发现僵尸进程(zombie/defunct):ps -ef | grep defunct

2 僵尸进程

2.1 进程简介

在 linux 中,父进程通过 fork 调用创建子进程。

f9e9df1aea042bfdf5838a2f68414145.png

d83efd5b1219863f5da698cdbef1b0aa.png

子进程执行完毕之后,内核会释放该子进程所占用的资源,包括打开的文件,占用的内存等,但仍然会在进程表中保留一个槽位(slot)存放该子进程的文件描述符(比如进程PID、进程退出状态、进程运行时间等),直到父进程发送 wait() 或 waitpid() 调用,内核才会把子进程文件描述符从进程表中彻底清除。如果父进程不调用 wait() 或 waitpid()对子进程进行清理,那子进程将处于僵尸状态。

但是如果父进程先于子进程结束的话,会导致子进程变成僵尸进程吗?答案是不会。因为每当进程结束的时候,系统都会扫描当前所有运行的进程,查找是否有这个结束进程的子进程,如果有,就由 init 进程(或者 systemd 进程)来接管子进程,成为子进程的新父进程,并自动 wait 这个子进程,确保以后该子进程不会变成僵尸进程。

2.2 僵尸进程例子

下面展示一个 c 语言编写的僵尸进程样例,样例中主进程并不会 wait 子进程,生成文件 zombie.c:#include

#include

#include

int main(void)  {

int i = 60;

pid_t pid = fork();

if ( pid < 0 )  {

perror( "fork error." );

exit(1);

}

if ( pid == 0 ) {

printf( "This is the child process. My PID is: %d. My PPID is: %d\n", getpid(), getppid() );

}

if (pid > 0)    {

printf( "This is the parent process. My PID is %d.\n", getpid() );

for( ; i > 0; i-- ) {

sleep(1);

}

}

return 0;

}

编译 zombie.c 并执行 zombie:yum install gcc

gcc zombie.c -o zombie

./ zombie

f9e9df1aea042bfdf5838a2f68414145.png

f687948a645047c7ddb005994ce996fa.png

上图中主进程 PID:11552,子进程 PID:11553。执行如下语句:发现 PID 为 11553 的子进程正好处于僵尸状态(defunct),由程序可知,因为主进程并没有 wait 子进程。ps aux | grep -i defunct

f9e9df1aea042bfdf5838a2f68414145.png

86a85b25037815446f60c5c3cd21e073.png        分析一下 zombie.c,特别注意 fork() 调用,在 pid_t pid = fork() 语句之前,只有一个进程,但是执行到这条语句之后,就变成2个进程了,这2个进程几乎完全相同,将要执行的下一条语句都是 if ( pid < 0 )。

fork() 函数比较特殊,它被调用一次,却能够返回两次结果,它的返回值也根据进程的不同而不同:1)在父进程中,fork 返回新创建子进程的 PID

2) 在子进程中,fork 返回 0

3)如果出现错误,则 fork 返回负值

2.3 僵尸进程危害

如果父进程没有 wait 子进程,子进程将变成僵尸状态,处于僵尸状态的进程将保留进程号(PID),众所周知,操作系统对进程号是有限制的,如果出现大量僵尸进程占用进程号,系统有可能无法创建新的进程。

3 处理僵尸进程

一般情况下处于僵尸状态的进程很难杀掉,当然你可以试着删除:

3.1 kill 命令kill -9 PID

3.2 kill 父进程kill -9 PPID

3.3 reboot

如果采用上面两种方式依然杀不掉,那么只能通过重启了。reboot

如果重启也不生效,可以需要加选项 -nfreboot -nf

3.4 magic sysrq key 方法

有时执行 reboot 命令还是无法重启,可以执行 magic sysrq 方法来通过提供给用户的 proc 接口直接向 kernel 发底层命令。

重启命令如下:echo 1 > /proc/sys/kernel/sysrq

echo b > /proc/sysrq-trigger

强制关机命令:echo 1 > /proc/sys/kernel/sysrq

echo b > /proc/sysrq-trigger

相关文章:

音视频开发学习笔记

http://www.jianshu.com/notebooks/6409162/top

VS2010 MFC中改变static字体颜色、大小、背景颜色(自定义类),及手动关联变量的方法...

在MFC的Dialog工程中生成一个CStatic的自定义类&#xff0c;类名例如为&#xff1a;CColorStatic 定义必要的变量&#xff1a; protected:COLORREF m_crText; // 字体颜色COLORREF m_crBackColor; // 背景颜色HBRUSH m_hBrush; // 画刷LOGFONT m_lf; // 字体…

android 上传字符串,Android中发送Http请求(包括文件上传、servlet接收)的实例代码...

/*** 通过拼接的方式构造请求内容&#xff0c;实现参数传输以及文件传输* param actionUrl* param params* param files* return* throws IOException*/public static String post(String actionUrl, Map params,Map files) throws IOException {String BOUNDARY java.util.UU…

JavaScript最全编码规范

转载: JavaScript最全编码规范 类型 ●基本类型&#xff1a;访问基本类型时&#xff0c;应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo 1; var bar foo; bar 9; console.log(foo, bar); // > 1, 9 ●复合类型&#xff1a;访问复合类型时&a…

源码推荐:collectionView拖拽,仿凤凰FM iOS 局部监听键盘再也不会挡住输入框

UICollectionView拖拽移动单元以及本地保存&#xff08;上传者&#xff1a;dengqi&#xff09; UICollectionView拖拽移动单元以及本地保存&#xff0c;可以保存你上次移动的位置。 仿映客直播导航条&#xff08;上传者&#xff1a;Coolcool&#xff09; 仿映客直播自定义TabBa…

采集练习(一) php 获得全国的小学(数据来自腾讯朋友网)

注&#xff1a;发现腾讯朋友网已经改版&#xff0c;部分参数需要自己获得修改 &#xff01;&#xff01;&#xff01; 年前有个需求获得某省的小学数据&#xff0c;分析了下朋友网的小学学校发现可以获得相关数据。 如获得 湖南省郴州市宜章县的全部小学 发现网页请求的地址…

android 模板方法模式,安卓设计模式(七)模板方法模式

模板方法模式用于固定相关操作的执行流程,将具体实现延迟到子类中该系列其他文章:定义: 定义一个操作中算法的框架,而降一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.使用场景:代码重构时,模板方法是经常被用到的,将固定部分提取到父…

solr单机版的搭建

一、solr单机版的搭建 1.运行环境 solr 需要运行在一个Servlet容器中&#xff0c;Solr4.10.3要求jdk使用1.7以上&#xff0c;Solr默认提供Jetty&#xff08;ja&#xff09;&#xff0c;本教va写的Servlet容器程使用Tocmat作为Servlet容器&#xff0c;环境如下&#xff1a; Solr…

android5.0后新特性修改标题头,Android5.0中Material Design的新特性

Material Design简介Material Design是谷歌新的设计语言&#xff0c;谷歌希望寄由此来统一各种平台上的用户体验&#xff0c;Material Design的特点是干净的排版和简单的布局&#xff0c;以此来突出内容。Material Design对排版、材质、配色、光效、间距、文字大小、交互方式、…

MFCard:易用的信用卡支付集成类库

原文链接&#xff1a;https://github.com/MobileFirstInc/MFCardMFCard&#xff1a;易用的信用卡支付集成类库。# 为开源点赞# —— 由 SwiftLanguage 分享MFCard is an awesome looking Credit Card input & validation control. Written in Swift 3. Demo Usage First St…

Castle ActiveRecord学习(四)延迟加载、分页查询、where条件

一、延迟加载 //用户发布的主题&#xff0c;一对多&#xff1b;Table&#xff1a;外键表&#xff1b;ColumnKey&#xff1a;外键&#xff1b;Lazy&#xff1a;延迟加载&#xff1b;Cascade&#xff1a;级联操作&#xff08;级联删除&#xff09;[HasMany(typeof(ThemeInfo), Ta…

系统吞吐量(TPS)、用户并发量、性能测试概念和公式(转载)

原文地址&#xff1a;http://www.ha97.com/5095.html PS&#xff1a;下面是性能测试的主要概念和计算公式&#xff0c;记录下&#xff1a; 一&#xff0e;系统吞度量要素&#xff1a; 一个系统的吞度量&#xff08;承压能力&#xff09;与request对CPU的消耗、外部接口、IO等等…

android layout后还原位置,Android图片框架photoview如何记住所有状态并还原,包括缩放度,缩放后的移动的距离等等...

Android图片框架photoview如何记住状态并还原&#xff0c;包括缩放度&#xff0c;缩放后的移动的距离等等,尝试了好多方法都没有作用。private void generateImages() {for (int i 0; i < imagesEntities.size(); i) {// PhotoViewAttacher attacher;final ImagesEntity en…

Shiro安全登录框架

环境准备 本文使用Maven构建&#xff0c;因此需要一点Maven知识。首先准备环境依赖&#xff1a; Java代码 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <…

iOS自动签名打包(xcodebuild)----常用

iOS自动打包主要用xcodebuild命令, 在终端输入xcodebuild --help可以查看xcodebuild的参数。 xcodebuild具体语法&#xff1a; 无workspace的工程 xcodebuild [-project name.xcodeproj] [[-target targetname] … | -alltargets] [-configuration configurationname] [-sdk [s…

设计模式解析(五)——几种设计模式之Facade和Adapter

由于个人时间原因&#xff0c;无法详细描述这些模式&#xff0c;暂且记录下来以后慢慢补充详细。 Facade模式 Facade模式&#xff1a;关键特征 意图希望简化原有系统的使用方式。需要定义自己的接口。问题只需使用某个复杂系统的子集&#xff0c;或者&#xff0c;需要以一种特殊…

android level list,Android Drawable (levle List selector layer List)

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;管理大量备选可绘制对象的可绘制对象&#xff0c;每个可绘制对象都分配有最大的备选数量。使用 setLevel() 设置可绘制对象的级别值会加载级别列表中 android:maxL…

人脸检测流程及正负样本下载

源地址&#xff1a;http://www.thinkface.cn/thread-146-1-4.html 人脸检测做训练当然可以用OpenCV训练好的xml&#xff0c;但是岂止于此。我们也要动手做&#xff01;~首先是样本的选取。样本的选取很重要&#xff0c;找了很久才发现几个靠谱的。人脸样本&#xff1a;http://w…

源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-

仿写映客直播&#xff08;上传者&#xff1a;五仁月饼&#xff09; 工作之余写的,基于IJKPlayer播放&#xff0c;对内存做了处理。目前已完成直播列表和直播间的搭建&#xff0c;后续还会慢慢完善。 项目地址 publishImageAndVideoAnsRecord&#xff08;上传者&#xff1a;zlj5…

希尔排序——算法系列

希尔排序&#xff1a; 插入排序的升级版&#xff0c;主要采用了分组的策略&#xff0c;采用逐渐减小步长来控制分组的大小&#xff0c;各组内采用插入排序&#xff0c;当步长减小为1的时候&#xff0c;大部分数据都已经有序&#xff0c;所以较插入排序优化了许多。 代码&#x…

android 请求方式有哪些,Android中的几种网络请求方式详解

Android应用经常会和服务器端交互&#xff0c;这就需要手机客户端发送网络请求&#xff0c;下面整理四种常用网络请求方式。java.net包中的HttpURLConnection类Get方式&#xff1a;// Get方式请求public static void requestByGet() throws Exception {String path "http…

Sqlserver的触发器的简单使用

1&#xff0c;触发器有两种 &#xff08;1&#xff09;After触发器&#xff08;之后触发&#xff09; 触发器有个好处&#xff1a;就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来&#xff0c;比如你删过什么信息&#xff0c;如果用触发器&#xff0c;那么删除后…

网络协议OSI、TCP/IP协议、Socket套接字和第三方AsyncSock的使用等解析

一、网络协议定义 1.OSI参考模型:全称(Open System Interconnection), 开放式系统互联参考模型。是一个逻辑上的定义&#xff0c;一个规范&#xff0c;它把网络协议从逻辑上分为七层&#xff0c;只要目的是为解决异种网络互连时所遇到的兼容性问题&#xff0c;其最主要的功能是…

Win8之快速关机

还在纠结如何关机吗&#xff1f;现在教你几招 1、 AltF4快捷键&#xff0c;Windows桌面下按AltF4即可弹出关机菜单&#xff08;保证无任何程序处于被选中状态&#xff0c;可以点击任务栏最右侧 来回到桌面&#xff0c;这时就没问题了&#xff09; 现在怎么关机就不用教了吧。 2…

多键开关 android8.0,手机桌面多键开关(SwitchPro Widget )

7键开关SwitchPro Widget 是款主屏幕窗口小部件工具&#xff0c;可用于开启/关闭多种系统功能&#xff0c;支持多种自定义设置&#xff0c;比原生的电量控制开关好用很多。7键开关SwitchPro Widget并非只有7个按键开关&#xff0c;而是有很多的意思&#xff0c;最多可以设置十几…

程序员取悦女票的正确姿势---Tip1(iOS美容篇)

前言 女孩子都喜欢用美图工具进行图片美容&#xff0c;近来无事时&#xff0c;特意为某人写了个自定义图片滤镜生成器&#xff0c;安装到手机即可完成自定义滤镜渲染照片。app独一无二&#xff0c;虽简亦繁。 JH定律&#xff1a; 魔镜&#xff1a;最漂亮的女人是你老婆 魔镜&am…

MySQL的安装配置(win7 64-bit)

MySQL的安装配置(win7 64-bit) 转&#xff0c;整理。 MySQL 版本是 mysql-noinstall-5.1.66-winx64.zip&#xff08;免安装版&#xff09; mysql-workbench-gpl-5.2.44-win32.msi mysql-connector-java-5.1.22 mysql 配置数据库编码为utf-8&#xff08;my.ini中指定&#xff09…

Sourse Insight使用教程及常见的问题解决办法

1、下载安装 2、创建项目new project(注意不是file-->new ),而是project-->new project,输入项目名称和密码. 3、添加文件&#xff0c;其实就是将你的整个项目文件添加到project中。 4、close就可以打开了。 具体参考道客巴巴一篇文章&#xff1a;Source_Insight教程及技…

android surface 平板,Surface平板能升级安卓4.0吗

Surface平板电脑暂时不能升级安卓4.0。Surface平板电脑x86架构的版本搭载了英特尔Core i5 Ivy Bridge双核处理器&#xff0c;而ARM架构的版本搭载了Nvidia代工的ARM单核处理器。Surface平板电脑采用镁合金机身&#xff0c;具有x86和ARM架构两个版本&#xff0c;x86架构的版本屏…

iOS - 实现映客首页 TabBar 和滑动隐藏 NavBar 和 TabBar

原文链接&#xff1a;http://www.jianshu.com/p/72228667cd7a之前在做直播的时候&#xff0c;参照了映客 App&#xff0c;发现其首页的效果还挺不错&#xff0c;在网上找了一下相关仿映客 App 代码和博客&#xff0c;大部分都是说如何播放直播流和推流&#xff0c;对于 UI 这块…