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 命令杀死进程

访问非法内存

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

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

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

相关文章

关键字:private关键字作用,解析及用法

private关键字在 Java 中用于定义类的成员&#xff08;如变量、方法&#xff09;的访问权限。它表示该成员只能在类的内部被访问和修改&#xff0c;而在类的外部是不可见的。 以下是private关键字的主要作用和解析&#xff1a; 作用&#xff1a; 封装性&#xff1a;通过将类的…

数学建模【聚类模型】

一、聚类模型简介 “物以类聚&#xff0c; 人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测&#xff0c;也可以探究不同类之间的相关性和…

[第九天】C++的string类以STL标准模板库(万字详细解说)

一、STL的概述 为提高复用性&#xff0c;建立数据结构和算法的一套标准&#xff0c;诞生了STL(Standard Template Library,标准模板库&#xff09;&#xff0c;STL从广义上分为三大组件:容器(container)、算法(algorithm)、迭代器(iterator)&#xff0c;容器和算法之间通过迭代…

MySQL 逗号分隔查询--find_in_set()函数

业务场景&#xff1a; 在使用MySQL的时候&#xff0c;可能的某个字段存储的是一个英文逗号分割的字符串&#xff08;这里我们不讨论表设计的合理性&#xff09;&#xff0c;如图所示&#xff1a; 我们在查询的时候需要匹配逗号分割中的某个字符串&#xff0c;该怎么查询呢&am…

压缩式 交换式 碎片整理 :(使碎片减少或没有)

交换式碎片整理 首先流程 是 p3这个程序在运行&#xff0c;p1p2p4 的话在等待 &#xff0c;然后p3这时要多用3个内存块&#xff0c;这是 p4 通过拷贝&#xff0c;将内存拷贝到磁盘上&#xff0c;对应的数据也是从主存中cp到磁盘此时主存多出3个内存块给p3继续使用 2.压缩式碎片…

手撕LRU缓存——LinkedHashMap简易源码

题目链接&#xff1a;https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 原理非常简单&#xff0c;一个双端链表配上一个hash表。 首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰&#xff0c;链表尾部就是最不常用的直接…

vue3批量创建svg icon组件

1、通过插件动态导入svg文件 安装vite插件vite-plugin-svg-icons npm i vite-plugin-svg-icons -D 配置插件svg-icon.ts import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; import path from "path";export default function createSvgI…

好物周刊#42:国产项目管理软件

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. 菠萝博客 基于 Java 的菠萝博客系统&#xff0c;简单易部署&#xff0c;精致主题&#xff0c;贴心服务&#xf…

模型优化_XGBOOST学习曲线及改进,泛化误差

代码 from xgboost import XGBRegressor as XGBR from sklearn.ensemble import RandomForestRegressor as RFR from sklearn.linear_model import LinearRegression as LR from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split,c…

ChatGPT提示词工程师AI大神吴恩达2023年视频课程学习实践

前言 刚才看了一个视频系列教程&#xff0c;很短&#xff0c;但收获很大&#xff0c;毕竟是一手知识来源&#xff0c;吴恩达大神亲自讲解&#xff0c;他说的话&#xff0c;我都信。这里写个笔记&#xff0c;顺便把知识点实践一下。视频可以去B站上搜索 吴恩达 prompt &#xf…

上门服务系统|上门服务小程序节省时间的必选利器

在如今的快节奏时代&#xff0c;我们的时间越来越宝贵。为了省时省力&#xff0c;越来越多的人选择使用上门服务类小程序。那么&#xff0c;为什么这些小程序能够如此受人欢迎呢&#xff1f;让我们一起揭示其中的原因。 一、方便快捷 上门服务类小程序最大的特点就是方便快捷。…

【探索AI】探索未来-计算机专业必看的几部电影

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…