fork创建子进程及僵尸进程的产生及规避

本篇文章的学习与总结来源于 https://www.bilibili.com/cheese/play/ep182659?csource=common_hp_history_null&t=3&spm_id_from=333.1007.top_right_bar_window_history.content.click

通常使用fork()函数产生新的子进程,需要包含两个头文件<sys/types.h>以及<unistd.h>,如果记不住也没关系,可以使用man命令进行查询 

man fork

常用相关函数介绍:

pid_t getpid(void);        //获取当前进程ID
pid_t getppid(void);     //获取父进程ID

fork()函数的基本使用

1. 从fork()函数往后,所有的代码子进程与父进程都要执行

 

2. fork()函数调用一次,则返回两次;也就是说有两个返回值,如果返回值大于0则为父进程返回,返回值等于0则为子进程返回

两个返回值的作用:可以用于父进程与子进程执行不同的逻辑代码

3. fork() 出来的子进程拥有所有资源的副本,在子进程中改变变量值,并不会影响父进程中的该变量的值,但是该变量在父进程与子进程中的地址是一样的(实际上是不一样的,这里的地址是经过处理的,是个虚地址,而真实的物理地址是不一样的

4. 如果父进程与子进程同时往同一个文件中写东西,则父进程与子进程共享同一个文件位置指针(文件偏移量)

僵尸进程的产生

1. 如果父进程比子进程先退出,则之后子进程由系统1号进程来托管(这也是让程序在后台运行的一种方式,其他方式有类似在命令行或程序后面加 '&' 符号来达成后台运行)

所以在任何程序main函数最开始的地方,加上  if(fork() > 0) return 0; 这行代码,都会让程序在后台运行

2. 如果子进程比父进程先退出,而父进程又没有处理子进程的退出信息,则子进程将会变成僵尸进程

僵尸进程的危害:僵尸进程会一直占用系统分配的进程编号,如果有太多僵尸进程的话,则可能会导致系统因没有可用的进程编号而不能产生新的进程;因为系统所产生的进程编号是有限的,会采用延迟复用算法将进程编号进行重复使用

知识点:系统内核为每一个子进程保留了一个数据结构,记录了进程ID,进程状态,进程所用cpu时间等信息,如果父进程处理了子进程的退出信息,则系统会立即释放该数据结构;否则,将不会释放该数据结构,导致子进程的进程编号一直被占用而得不到释放

僵尸进程的规避

1. 父进程添加  signal(SIGCHLD,SIG_IGN); 表示对子进程的退出并不感兴趣(因为子进程退出时,内核会向父进程发送 SIGCHLD 的信号,如果父进程忽略了该信号,则子进程退出后,内核会立即释放数据机构

该方法简单易懂,但是不会得到子进程的退出相关信息

2. 父进程调用wait()函数等待子进程结束,在子进程退出前,父进程将一直处于阻塞状态

pid_t wait(int *stat_loc);

函数返回值为子进程编号;

stat_loc 保留子进程的终止信息:

如果正常退出(使用return,exit(),_exit()等都属于正常退出),宏 WIFEXITED(stat_loc)为真,宏WEXITSTATUS(stat_loc)可获取终止状态

如果异常退出(使用kill/kill -9 /程序访问非法内存都是异常退出),宏WTERMSIG(stat_loc)可获取终止进程的信号

使用 kill pid 命令杀死进程

使用 kill -9 pid 命令杀死进程

访问非法内存

以上总结了进程创建与僵尸进程如何规避的基本使用方法,共勉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Windows中安装PyTorch

文章目录 1. 创建虚拟环境2. 检查显卡版本和CUDA3. 下载链接4. 下载5. 等待6. 检测 1. 创建虚拟环境 具体查看我之前写的 《在Windows中利用Python的venv和virtualenv创建虚拟环境》 2. 检查显卡版本和CUDA 这种情况是需要电脑上有单独的英伟达的显卡、或者英伟达的显卡和集显…

Rocky Linux 运维工具 mv

一、mv的简介 ​​mv​是Linux系统中的命令&#xff0c;用于移动文件或重命名文件。它可以在同一文件系统内将文件从一个目录移动到另一个目录&#xff0c;也可以修改文件的名称。 二、mv的参数说明 1、 三、mv的实战示例 1、重命名 ###查看目录/root/下的文件列表 [rootloc…

Aws Ec2服务器设置密码登录

通过密钥&#xff0c;ssh登录到服务器 切换到root sudo -i开始设置root的新密码 passwd root输入并确认新密码即可 5.修改ssh配置文件 vim /etc/ssh/sshd_config6.重启sshd配置 systemctl restart sshd

Linux:Makefile的相关知识

背景&#xff1a; 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于进行更复…

周鸿祎首堂免费课与千万网友分享“AGI趋势”

“我讲课不割韭菜&#xff0c;宗旨是免费、分享、科普、交流。AI时代技术发展迅速&#xff0c;AI知识普及尤为重要。”2月29日&#xff0c;360公司创始人周鸿祎免费课正式开启&#xff0c;全网多平台直播了AI系列第一讲“预见AGI”&#xff0c;千万网友观看。免费课上&#xff…

算法 -【从前序与中序遍历序列构造二叉树】

从前序与中序遍历序列构造二叉树 题目示例1示例2 分析代码 题目 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例1 输入: preorder [3,9,20,1…

【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM

题目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 机构&#xff1a;CMU&#xff08;卡内基梅隆大学&#xff09;、MIT&#xff08;美国麻省理工&#xff09; 总结&#xff1a;SplaTAM&#xff0c;一个新…

【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II

博主简介&#xff1a;努力学习和进步中的的22级计科生博主主页&#xff1a; Yaoyao2024每日一句: “ 路虽远&#xff0c;行则将至。事虽难&#xff0c;做则可成。” 前言 前言&#xff1a;动规五部曲 以下是《代码随想录》作者总结的动规五部曲 确定dp数组&#xff08;dp tab…

[LeetCode]143.重排链表

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reorder-list/description/ 题目 示例 解题思路 寻找链表中点 链表逆序 合并链表 注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。 这样我们的任务即可划分为三步&a…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…

安卓开发1- android stdio环境搭建

安卓开发1-android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环…

Sora技术原理解析

1.Sora简介 Sora是一个基于大规模训练的文本控制视频生成扩散模型。 Sora能够生成高达1分钟的高清视频&#xff0c;涵盖广泛的视觉数据类型和分辨率。 Sora使用简单的文本描述&#xff0c;使得视频创作变得前所未有的简单和高效。 Sora的一些能力&#xff1a; Text-to-video…

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Qt篇——QTableWidget选中多行右键删除

效果如图&#xff1a; 代码如下&#xff1a; 头文件中&#xff1a; QTableWidgetItem *selectedItem; //表格被选中的一行 QMenu* originDataTableContextMenu; //表格右键菜单 QAction* originDataTableActionDel; //表格右键菜单…

腾讯云又双叕降价,云服务器配置优惠价格表2024新版报价

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

分组背包(相关解析及例题)

1.概念 分组背包&#xff1a; 分组背包就是有n组物品&#xff0c;每组物品中只可以选择一个物品。 每个物品都有体积和价值&#xff0c;求总体积不超过m的情况下的价值最大值。 那么我们就可以通过概念来得到状态转移方程&#xff1a; dp[ j ]max(dp[ j ],dp[ j -w[ i ][ …

打造透明银行存储:Solidity智能合约的实践与探索

引言&#xff1a; 随着区块链技术的快速发展&#xff0c;智能合约作为其中的核心组件&#xff0c;正被越来越多地应用于各种场景。作为智能合约的编程语言&#xff0c;Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中&#xff0c;我们将通过构建一个透明的银行存储…

RT-Thread+ENV+MDK+STM32CubeMX适配

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动/单片机/RTOS的实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff…

45、WEB攻防——通用漏洞PHP反序列化POP链构造魔术方法原生类

文章目录 序列化&#xff1a;将java、php等代码中的对象转化为数组或字符串等格式。代表函数serialize()&#xff0c;将一个对象转换成一个字符&#xff1b;反序列化&#xff1a;将数组或字符串等格式还成对象。代表函数unserialize()&#xff0c;将字符串还原成一个对象。 P…

基于ESP32的MicroPython项目量产烧写指南

背景 前段时间用MicroPython开发了一个项目&#xff0c;硬件是ESP32-C3&#xff0c;目前准备量产&#xff0c;我需要提供固件以供加工厂批量烧录&#xff0c;需要把我有程序的板子里的程序读出来&#xff0c;然后下到别的板子上&#xff0c;以下做这件事情的过程记录。 1.固件…