如何模拟一个僵尸进程

news2024/11/25 22:51:29

原理

子进程先于父进程退出,父进程还在继续运行,且没有调用wait函数。

实验代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int pid = fork();
    if(pid == 0){
        DEBUG_INFO("i'm a child process %d",getpid());
        return 0;
    }

    DEBUG_INFO("i'm a parent process %d",getpid());
    pause();
    DEBUG_INFO("BYEBYE");
    return 0;
}

执行结果:

 此时程序父进程处于pause状态。子进程的PID是21964, 搜索该进程:ps aux | grep fork,如下所示,

看到PID号为21964的进程,就是截图中间那个。它的最后是<defunct>,没错它就是僵尸进程了。

 wait函数

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);

 测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int pid = fork();
    if(pid == 0){
        DEBUG_INFO("i'm a child process %d",getpid());
        return 0;
    }

    DEBUG_INFO("i'm a parent process %d",getpid());
    int status = 0;
    int res = wait(&status);
    DEBUG_INFO("wait res = %d status = %d",res,status);
    pause();
    DEBUG_INFO("BYEBYE");
    return 0;
}

实验结果:

 

实验解析

此时,子进程22302已经安息了,它的PID通过wait函数的返回值传递给了父进程,返回值通过status传递给了父进程。 

为了获取有效的返回值,修改代码如下所示:

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

void pr_exit(int status)
{
    if (WIFEXITED(status))
        printf("normal termination, exit status = %d\n",
                WEXITSTATUS(status));
    else if (WIFSIGNALED(status))
        printf("abnormal termination, signal number = %d%s\n",
                WTERMSIG(status),
#ifdef    WCOREDUMP
                WCOREDUMP(status) ? " (core file generated)" : "");
#else
                "");
#endif
    else if (WIFSTOPPED(status))
        printf("child stopped, signal number = %d\n",
                WSTOPSIG(status));
}

int main(int argc, char *argv[])
{
    int pid = fork();
    if(pid == 0){
        DEBUG_INFO("i'm a child process %d",getpid());
        return -2;
    }

    DEBUG_INFO("i'm a parent process %d",getpid());
    int status = 0;
    int res = wait(&status);
    DEBUG_INFO("wait res = %d status = %d",res,status);
    pr_exit(status);
    pause();
    DEBUG_INFO("BYEBYE");
    return 0;
}

执行结果: 

  实验解析

当进程返回-1时,红色框中的值是255,当前返回值是-2,红框中的值是254.

waitpid函数 

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

小结

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

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

相关文章

Zabbix“专家坐诊”第196期问答汇总

问题一 Q&#xff1a;统计一个主机群组里&#xff0c;值为A的某个监控项的个数&#xff0c;函数应该怎么写&#xff1f; A&#xff1a;参考&#xff1a; https://www.zabbix.com/documentation/6.0/zh/manual/config/items/itemtypes/calculated/aggregate。 Q&#xff1a;文…

零基础如何学习 Web 安全,如何让普通人快速入门网络安全?

前言 网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 【一一帮助安全学习&#xff08;网络安全面试题学习路线视频教程工具&#xff09;一一】 初级的现在有很多的运维人员转网络安全&#xff0c;初级…

lammps案例:原子倒入容器

本文介绍lammps向体系内动态添加原子的一种方法。 在绝大多数的分子动力学模拟过程中&#xff0c;原子数量保持恒定。 如果需要按一定步数动态的减少原子&#xff0c;可参考&#xff1a; 删除蒸发原子 动态的增加原子&#xff0c;可以使用fix deposit沉积命令&#xff1a; 沉积…

《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

环境 操作系统: Windows11 显卡: RTX2060 6GB 显存 安装Python 下载 Python3.10.6 https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe安装 注意勾选 Add Python 3.10.6 to PATH &#xff0c;然后一路下一步即可 打开powershell&#xff0c; 确认安装成功 …

Opencv项目实战:23 智能计数和表单信息

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与部分讲解 拍照脚本data_collection.py 图片检测Picdetect.py 摄像头检测Videodetect.py 主函数CountMain.py 自定义模块tally.py 4、项目资源 5、项目总结 0、项目介绍 有一段时间没有更新专栏了&#…

“专精特新”企业数字化转型,如何激发增长新动能

随着数字技术的不断发展&#xff0c;越来越多的企业开始意识到数字化转型的重要性。对于专精特新的企业来说&#xff0c;数字经济的发展也同样给中小企业带来难得的发展机遇&#xff0c;数字化在助力中小企业降本、增效和提质方面发挥着日益重要的作用&#xff0c;数字化转型已…

英伟达发布GeForce 536.23游戏驱动,一键快速获取

英伟达又赶在6月发布了一款超强游戏驱动&#xff0c;NVIDIA GeForce 536.23 WHQL&#xff0c;并有两款游戏大作宣布&#xff0c;首发日即支持 NVIDIA DLSS 2 和 NVIDIA Reflex&#xff0c;驱动人生带大家一起了解一下这款NVIDIA GeForce 536.23 WHQ驱动&#xff0c;以及获取英伟…

Linux【系统学习】(命令及虚拟机篇-无shell)

目录 第 1 章 Linux 入门 1.1 概述 1.2 Linux 和 Windows 区别 ​编辑 1.3 CentOS 下载地址 第 2 章 VM 与 Linux 的安装 2.1 VMWare 安装 CentOS 安装 第 3 章 Linux 文件与目录结构 3.1 Linux 文件 3.2 Linux 目录结构 第 4 章 VI/VIM 编辑器&#xff08;重要&…

智能客服机器人:基于知识图谱的多轮对话系统

━━━━ 近年来&#xff0c;随着人工智能的快速发展&#xff0c;人机交互能力不断增强&#xff0c;其中问答技术能够在保证一定准确度的情况下极大地简化用户的搜索操作&#xff0c;在节约时间的同时&#xff0c;还能够加深用户对搜索事物的了解程度&#xff0c;百度公司的小…

一篇文章搞定《Android中View的绘制流程》

一篇文章搞定《CoordinatorLayout完成电商首页》 本文前言怎样到达ViewRootImpl过程如下&#xff1a;流程图小结&#xff1a; 到达ViewRootImpl做了什么第一步&#xff1a;setView()第二步&#xff1a;performTraversals()第三步&#xff1a;DecorView中的Measure()、Layout()、…

nginx配置代理报错

1.背景 因部署需要将项目用nginx进行二次转发访问&#xff0c;配置过程中出现各种报错&#xff0c;现将记录如下 Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as.... 2.nginx配置如下 upstream wuhan1 {#server 19…

【SpringBoot】整合Elasticsearch 操作索引及文档

官网操作文档&#xff1a;Elasticsearch Clients | Elastic 踩坑太多了。。。这里表明一下Spring Boot2.4以上版本可能会出现问题&#xff0c;所以我降到了2.2.1.RELEASE。对于现在2023年6月而言&#xff0c;Es版本已经到了8.8&#xff0c;而SpringBoot版本已经到了3.x版…

Hyper-v 虚拟机挂载物理硬盘的方法-Windows Server 2022/2025

起因&#xff1a; 之前我写过一篇介绍在KVM虚拟机体系下&#xff0c;如何直接挂载物理硬盘和物理分区的方法&#xff1a;KVM虚拟机直接挂栽物理硬盘分区的方法_给libvirt虚机挂载磁盘_lggirls的博客-CSDN博客。近期帮助一个朋友搭建局域网&#xff0c;其中有OA系统要用到window…

【安全】awvs使用(二)

目录 一、设置目标 二、设置登录 三、扫描引擎 四、开启扫描 五、扫描结束 六、报告 前言&#xff1a;怎么使用awvs进行扫描出报告呢&#xff1f; 一、设置目标 二、设置登录 因为扫描的网站需要登录的&#xff0c;这里需要设置这个 三、扫描引擎 四、开启扫描 翻译的页面…

【正点原子STM32连载】第三十六章 SPI实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第三…

测试实战总结,性能测试-秒杀系统实战与优化,彻底打通性能测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 对于大并发量的系…

小程序跳转

小程序的路由跳转 一、路由跳转的方式 1.1 wx.navigateTo wx.navigateTo 保留当前页面&#xff0c;跳转到应用内的某个页面。会将页面缓放在页面栈中&#xff0c;最多十个。 wx.navigateTo({url: test })1.2 wx.redirectTo wx.redirectTo 关闭当前页面&#xff0c;跳转到应…

电商项目,订单如何测试?软件测试实战场景,所有测试点汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 订单测试作为常见…

scanpy单细胞分析流程

梳理一下scanpy单细胞分析流程&#xff08;处理的是scRNA-seq&#xff09;。 先上一张流程图&#xff1a; scanpy单细胞分析流程 import scanpy as scRead data 常用的文件格式有两种&#xff0c;分别是h5ad和10X mtx # read h5ad adata sc.read()# read 10X mtx adata …

从小白到大神之路之学习运维第44天---第三阶段----拓展知识-----文件管理命令(find+sed+awk)、pycharm工具

第三阶段基础 时 间&#xff1a;2023年6月20日 参加人&#xff1a;全班人员 内 容&#xff1a; 目录 一、文件管理命令 find 1. 根据文件名查找文件 2. 根据文件类型查找文件 3. 根据文件大小查找文件 4. 根据时间戳查找文件 5. 组合多个条件查找文件 Sed 1. 替…