wait函数和僵尸进程(APUE)

fork两次如何避免僵尸进程 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD 信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也 不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init... 阅读详情

wait函数和僵尸进程(APUE)

wait和waitpid函数原型:

1 #include <sys/wait.h>
2 
3 pid_t wait(int *status);
4 pid_t waitpid(pid_t pid, int *status, int options);

当进程正常或者异常终止时,内核就像其父进程发送SIGHLD信号,因为子进程终止是个异步信号,所以这种信号也是内核向父进程发的异步通知。对于这种信号,系统默认动作是忽略它,此时进程状态一直保存在内存中,直到父进程使用wait函数收集状态信息,才清空。用wait来等待一个子进程终止运行叫回收进程,如果一个子进程终止后,父进程没有调用wait函数收集信息,子进程就会变成僵尸进程,僵尸进程不占有内存资源,仅仅在进程表中保留位置,占用进程ID。当子进程变成僵尸进程后,我们可以选择杀死父进程,这样init进程就会处理该僵尸进程。

下面看看僵尸进程的形成:

复制代码
 1 #include "apue.h"
 2 #include <sys/wait.h>
 3 
 4 int
 5 main(void)
 6 {
 7     pid_t pid;
 8     if((pid = fork()) < 0)
 9       err_sys("fork error");
10     else if(pid == 0)
11       printf("This is child process with pid of %d\n", getpid());
12     else{
13         sleep(20);
14         printf("This is parent process with pid of %d\n", getpid());
15     }
16     exit(0);
17 }
复制代码

编译程序,运行。

1 $ gcc test_zombie.c 
2 $ ./a.out

同时打开另外一个终端:

1 $ ps -C a.out -o ppid,pid,stat,cmd
2  PPID   PID STAT CMD
3  3649  3887 S+   ./a.out
4  3887  3888 Z+   [a.out] <defunct>

可以看到,子进程PID=3888退出(exit(0))后成为僵尸进程(stat为Z)。

调价wait() 调用。

复制代码
 1 #include "apue.h"
 2 #include <sys/wait.h>
 3 
 4 int
 5 main(void)
 6 {
 7     pid_t pid;
 8     if((pid = fork()) < 0)
 9       err_sys("fork error");
10     else if(pid == 0)
11       printf("This is child process with pid of %d\n", getpid());
12     else{
13         printf("I catched a child process with pid of %d\n", wait(NULL));
14         sleep(20);
15         printf("This is parent process with pid of %d\n", getpid());
16     }
17     exit(0);
18 }
复制代码

输出结果:

1 $ ps -C a.out -o ppid,pid,stat,cmd
2  PPID   PID STAT CMD
3  3649  4100 S+   ./a.out
1 $ ./a.out 
2 This is child process with pid of 4101
3 I catched a child process with pid of 4101
4 This is parent process with pid of 4100

 

waitpid函数(摘自网络):

参数pid的值有以下几种类型:

  pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去.

  pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样.

  pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬.

  pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值.

  参数options的值有以下几种类型:

  如果使用了WNOHANG参数,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去.

  如果使用了WUNTRACED参数,则子进程进入暂停则马上返回,但结束状态不予以理会.

  Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:

  ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);

  如果我们不想使用它们,也可以把options设为0,如:ret=waitpid(-1,NULL,0);

  waitpid的返回值比wait稍微复杂一些,一共有3种情况:

     当正常返回的时候waitpid返回收集到的子进程的进程ID;

  如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

  如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

  当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD.



人机协作新纪元:AI会抢走IT人的饭碗吗? 产品经理用自然语言描述需求,AI将其转化为技术规格书(准确率已达89%) 阅读详情

相关推荐

全国排污许可证数据

from tkinter import * # 导入窗口控件 import tkinter.filedialog import requests from lxml import etree from tkinter import ttk from bs4 import BeautifulSoup import webbrowser # 调用浏览器打开网页 from tkinter import messagebox # 弹出提示框 from openpyxl import Workbook imp.

Newnotes的博客 3387

Linux中的僵尸进程与wait函数、waitpid函数详解(附图解与代码实现)

僵尸进程的概念及危害 僵尸进程,子进程先于父进程退出,但是系统回收进程资源时,子进程PCB残留,这个进程为僵尸进程 危害:1.PCB残留导致内存泄露 2.由于PCB创建的数量是固定的,一个僵尸进程会占用一个PCB,从而影响新进程的创建 父进程先于子进程退出的话会产生孤儿进程 为什么PCB会有残留呢? 我们假设张三的孩子张思睿出了车祸,医院没救过来,结果医院直接一把火给尸体烧了,你说这合理吗?这显然不合理,只有父母有权来决定自己的孩子尸体怎么处理,父母可以通过别的方式来知道自己的孩子.

m0_53133879的博客 1468

用Python实现单层感知器:5分钟搞定逻辑与/或/异或分类(附避坑指南)

本文通过Python代码实战,详细讲解了单层感知器的核心原理与实现步骤,5分钟内即可完成逻辑与、或运算的分类任务。文章深入剖析了单层感知器的能力边界,解释了其无法解决异或(XOR)等线性不可分问题的根本原因,并提供了学习率设置、权重初始化等关键避坑指南,帮助初学者直观理解神经网络的基础。

ttt77的博客 1084

爬虫中加密和混淆技术

我们在爬取网站的时候,经常会遇到各种各样类似加密的情形,比如说: 某个网站的 URL 带有一些看不太懂的长串加密参数,要抓取就必须要懂得这些参数是怎么构造的,否则我们连完整的 URL 都构造不出来,更不用说爬取了。 分析某个网站的 Ajax 接口的时候,可以看到接口的一些参数也是加密的,或者 Request Headers 里面也可能带有一些加密参数,如果不知道这些参数的具体构造逻辑就没法直接用程序来模拟这些 Ajax 请求。 翻看网站的 JavaScript 源代码,可以发现很多压缩了或者看不太懂的字符,

weixin_43380984的博客 919

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 485

某手 v8.x 签名计算方法(二) sig和__NS_sig3

一、目标 今天的目标是 sig和__NS_sig3,咱们抓个包先 二、步骤 sig目测像是MD5 先jadx搜索 sig= ,没有找到结果。 再试试 sig ,晕倒 6k多个结果,突然灵光一闪,这些参数,必然是要加入到 Map中,那么我们搜索 "sig" 应该就是这个 CPU.getClock,Hook之 var signCls = Java.use('com.yxcorp.xxx.util.CPU'); signCls.getClock.implementation = function(a,b,c

fenfei331的博客 2428

fork()函数和僵尸进程和孤儿进程

Linux 下通过fork()函数来产生新的进程,新的进程和原来的进程的各种数据和代码几乎是一模一样的,但是创建了新的进程之后,这个两个的进程就是异步的,指不定是谁先结束,这个时候就有可能父进程先结束,子进程没有结束,也有可能子进程先结束,然后父进程在结束。这个是九有孤儿进程和僵尸进程的问题。 首先,每个进程在运行的时候回有各自的pid 这个pid 是 是表示该进程的唯一的ID 号的...

id145的博客 309

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

阿飞2018 1385

老卫带你学---python进程池apply与apply_async

python进程池apply与apply_async apply方法是阻塞的。 意思就是等待当前子进程执行完毕后,在执行下一个进程。 apply_async 是异步非阻塞的。 意思就是:不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。 apply是阻塞式的。 首先主进程开始运行,碰到子进程,操作系统切换到子进程,等待子进程运行结束后,在切换到另外一个子进程,直到所有子进程运行完毕。然后在切换到主进程,运行剩余的部分。 apply_async是异步非阻塞式的。 首先主进程开始运行,碰到子进程后,主

老卫带你学 513

11、iOS设备逻辑数据分析全解析

本文深入解析iOS设备中的逻辑数据,涵盖图像相关数据库(Photos.sqlite和PhotosAux.sqlite)、录音文件、iPhoto照片存储结构、多媒体文件、第三方应用程序、社交网络应用(如Twitter、Skype、Facebook等)以及苹果相关应用(如Google Mobile、Bing)的数据存储结构和取证方法。此外,还介绍了文档类应用(如Pages、Numbers、Documents To Go)的文件存储结构及恢复方法。适用于iOS取证、数据挖掘和数字调查领域。

rain6的博客 226

YOLOv11的对比学习预训练改进-(通过SimCLR预训练增强特征提取)

本文介绍了将SimCLR对比学习预训练与YOLOv11目标检测模型相结合的创新方法。文章首先概述了目标检测领域的发展现状和YOLOv11的架构优化,包括主干网络、特征金字塔和检测头的改进设计。其次详细解析了SimCLR对比学习的核心原理,涵盖数据增强、投影头设计和NT-Xent损失函数。最后探讨了如何将对比学习与目标检测有效结合,通过特征空间对齐和渐进式微调策略提升模型性能。该方法显著增强了特征提取能力,提高了检测精度和训练效率,特别是在小目标和遮挡目标的检测上表现突出。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 685

UNIX系统中wait函数族和SIGCHLD信号的关系

有朋友疑惑“为什么有了wait函数族还需要使用SIGCHLD信号?”。本文详细地阐述UNIX系统中wait函数族和SIGCHLD信号的关系。 一、unix中僵尸进程的含义 关于unix中僵尸进程的含义,APUE2是这样定义: In UNIX System terminology, a process that has terminated, but whose parent ha

宋陆平 2713

OpenClaw实战一|企业微信AI客服数字员工:自动应答+工单创建+数据统计,零代码3天落地

OpenClaw做企业微信AI客服数字员工,真正的价值不是“能自动回复”,而是把“咨询-应答-工单-统计-复盘”全流程闭环。对中小企业来说,不用招专职AI开发、不用买昂贵客服系统,一台服务器、零代码配置,就能拥有媲美大厂的智能客服能力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 517

java 僵尸进程_僵尸进程ZOMBIE

僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在L...

weixin_39793794的博客 816

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

apue学习之fork函数基础

apue学习之fork函数详解 1 函数接口 #include<unistd.h> pid_t fork(void); 返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1。 fork()创建的新进程被称为子进程,fork()调用一次但是返回2次。 ...

AlexanderGan的博客 345

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

也谈僵尸进程

一. 何为僵尸进程 僵尸进程 zombie 或 defunct ,ps , top 命令可以看到。 说的是处于“僵死”状态的进程。 这样的进程已经死亡,但仍然以某种方式存活着。说其已经死亡,是因为其资源(内存、外设链接等)已经释放,其无法也绝不会再次运行。说其存活着,是因为系统进程表中仍然存在该进程描述符。 看看Linux定义的进程状态: include/linux/sched.h

CC 962

VC中sqlite的使用

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

apue-僵尸进程

何为僵尸进程:僵尸进程是子进程挂掉了,而父进程没有去wait(即:回收)。 这个时候的僵尸进程又不占内存又不占cpu,为什么大家还是很忌讳呢? 因为它占了系统资源。

wusoule的专栏 880

APUE学习之信号(Signal)

对于目前Linux的两个信号安装函数:signal()及sigaction()来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。父进程一旦调用wait函数就立即开始阻塞,然后wait会分析当前进程的某个子进程是否已经退出,如果让它找到了这样一个退出的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回,如果没有找到,就一直阻塞,直至找到一个结束的子进程或接收到了一个指定的信号为止。

m0_65292176的博客 1176

exit()与wait-()函数

exit()与wait*()函数 exit()与wait*()函数进程控制这节的知识我就基本只是把书上的整理了一下, 仅仅只是个人觉得有用的整理了下。exit()函数 _Exit() : 其目的是为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法 _exit() : _exit()由exit()调用,处理UNIX特定的细节 最后一个进程调用return等其他终

啦啦啦 1485

UNIX系统中wait函数族和SIGCHLD信号的关系(转)

 有朋友疑惑“为什么有了wait函数族还需要使用SIGCHLD信号?”。本文详细地阐述UNIX系统中wait函数族和SIGCHLD信号的关系。一、unix中僵尸进程的含义关于unix中僵尸进程的含义,APUE2是这样定义:In UNIX System terminology, a process that has terminated, but whose parent has n

serverside的专栏 2221

APUE:进程:wait、waitpid

在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init始

u012839809的专栏 479

UNIX多进程 - 销毁僵尸进程 - wait()和waitpid()函数

#include <sys/types.h> #include <sys/wait.h>pid_t wait(int *status); pid_t waitpid(pid_t pid, int *statusPtr, int options);现在要知道调用wait或waitpid的进程可能会发生什么情况: 如果其所有子进程都在运行,则阻塞。 如果一个子进程已经终止,正在等待的父进程获取到终止

yapian8的专栏 794

fork与僵尸进程和孤儿进程

转载至《孤儿进程与僵尸进程[总结]》 /* fork() 1. 函数将创建一个与原来进程几乎完全相同的进程 2. fork创建失败时返回-1,创建成功将会有两个返回值(0 代表子进程;> 0代表父进程,值为子进程id) 3. fork将可能产生孤儿进程和僵尸进程 4. 父进程退出但子进程没有退出,子进程将成为孤儿进程;孤儿进程将会由init进程处理,不影响系...

David 518

linux 识别僵尸进程,linux下僵尸进程(Defunct进程)的产生与避免

在测试基于 DirectFB+Gstreamer 的视频联播系统的一个 Demo 的时候,其中大量使用 system 调用的语句,例如在 menu 代码中的 system("./play") ,并且屡次执行,这种状况下,在 ps -ef 列表中出现了大量的 defunct 进程,对程序的运行时有害的。按说system的源码中应该已经包含了wait,但也不能排除开发板上这个版本的system中可能没...

weixin_33534991的博客 787

wait,waitpid,waitid,wait3,wait4

8.6 wait and waitpid function1.子进程停止回向父进程发送SIGCHLD信号2.父进程调用wait会有如下情况:·         Block, if all of its children are still running·         Return immediately with the termination status of a c

ptn3900的专栏 1479
上一篇: 进程编程&mdash;fork,getpid,exit
下一篇: 20个顶尖的HTML5动画网站欣赏!来开动你的大脑吧~
LuckyJiang.2021
博客等级 码龄15年 217粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyJiang.2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值