当前位置: 首页 > news >正文

Linux Day07

一、僵死进程

1.1僵死进程产生的原因

       子进程先于父进程结束, 而父进程没有获取子进程退出码,释放子进程占用的资源,此时子进程将成为一个僵死进程。

在第一个框这里时父进程子进程都没有结束,显示其pid 父进程是2349,子进程是2350

在第二个框这里时父进程没有结束,子进程结束,因此显示父进程的pid,但是因为父进程没有获取子进程的退出码,子进程就处于僵死状态<defunct>

第三个框这里父进程结束,父进程成功获取子进程的退出码,子进程结束。

1.2 PCB消失的条件

       获取到退出码,子进程要父进程获取子进程的退出码才能完全结束。


1.3危害

        占用资源空间。如果进程不调用wait/waitpid,那么保留的那段信息就不会被释放,其进程号就会一 直被占用,但是系统能使用的进程号是有限的,如果产生大量的僵死进程,将因为没有可用的进程号而 导致系统不能产生新的进程。

1.4 如何处理

1.父进程调用wait()方法获取子进程的退出码

wait(&val):执行该指令,会将子进程的退出码填到val中。

结果:

这个时候我们不难发现:先打印的都是子进程,父进程一点都没有打印,当子进程结束才开始父进程,等val退出码打印后才开始。

原因:wait,即先阻塞父进程,直至子进程运行结束,父进程获取到子进程的退出码后,父进程才继续运行。


wait(&val):返回值pid_t,调用函数后会将退出码通过指针赋值到val上。
WIFEXITED(val):由于退出码为1字节,val为4字节,通过该函数可以将其转化为1字节,返回值为bool类型,判断进程是否正常结束。
WEXITSTATUS(val):获取进程退出状态。

2.父进程先结束----孤儿进程

结果

 在父进程结束后出现了提示符,但是此时子进程还没有结束,所以还在执行

第一个框,父进程的id为2621,他的父进程是2135,子进程的id为2622,他的父进程为2621

父进程结束后,会随机为子进程分配一个父进程,该父进程的id为1536,收养了这个孤儿进程

注意:老版本是 init进程,其进程号为1,新版本是随机分配一个系统进程

init进程一定会对子进程执行wait()指令,获取子进程的退出码,子进程的pcb被操作系统删除,至此子进程彻底结束。

1.5 练习

1.5.1  练习一

结果

原因

板块一:此时i=0,执行fork语句生成板块2,打印第一个A,此时i++变成1,然后继续循环,执行fork语句,生成板块3(板块三的i是从1开始的),打印第二个A,i++变成2,结束板块一

板块三:因为是子进程,从fork语句后执行,打印第一个A,i++变成2,结束板块三

板块二:也是子进程,从fork语句后执行,打印第一个A,i++变成1,继续循环,执行fork语句生成板块四(板块四的i是从1开始的),打印第二个A,i++变成2,结束板块二。

板块四:也是子进程,打印第一个A,i++变成 2,结束板块2.

总计:6个A

 1.5.2 练习二

 

结果

原因

注意一点:fork()执行完后,子进程从fork语句后执行

第一个板块:执行fork语句生成板2,此时将打印的A放在缓冲区,为什么呢?可以看下linux day06讲printf这块,此时i++变成1,继续循环,执行fork语句生成板块3,(注意板块三内容有原先父进程的缓冲区:A和i=1),然后执行printf,此时板块1的缓冲区中有AA两个,i++等于2,结束板块1.

第三个板块:因为复制了板块1的,i从1开始,直接执行printf语句,缓冲区有AA两个,i++变成2,j结束板块3.

第二个板块:因为是板块1的子进程,从printf处执行,缓冲区有一个A,i++等于1,继续for循环,执行fork语句形成板块4,然后缓冲区:AA,i++->2,结束板块2

第四个板块:因为复制了板块2,从printf处执行,缓冲区:AA,i++ ->2结束板块4

所以总计8个A

 

 注意:练习一和练习二最大的区别在于缓存区的刷新

1.5.3 练习三

结果

 原因

首先执行fork()||fork()语句,复制了一份,因为父进程的id>0,根据或语句特点直接结束,打印第一个A。然后子进程中0||fork(),或语句如果第一个为1 就直接跳过了,但是为0 就要继续执行后面语句,因此复制了一份代码,由于第二个fork()返回了当前父进程的id,直接结束语句,打印第二个A。最后子进程的pid为0,所以返回值为0,0||0为假,打印最后一个A结束整个程序,所以打印三个A

 

二、操作文件的系统调用

在C语言中有fopen,fclose等文件操作

头文件:#include<fcntl.h>

2.1 open()

 文件已存在:int open(const char *pathname, int flags);
 文件之前不存在,需要创建:int open(const char *pathname, int flags, mode_t mode);

pathname :将要打开的文件路径和名称
flags : 打开标志,如 O_WRONLY 只写打开    O_RDONLY 只读打开
                                  O_RDWR 读写方式打开   O_CREAT 文件不存在则创建   
                                  O_APPEND 文件末尾追加  O_TRUNC 清空文件,重新写入
mode : 权限 如:“0600”  0是八进制,6是4 r+2 w
返回值: 为文件描述符

2.2 read()

从文件中提取数据

ssize_t read( int fd, void * buf, size_t count);
fd 对应打开的文件描述符
buf 存放数据的空间
count 计划一次从文件中读多少字节数据 
返回值 :为实际读到的字节数

2.3 write()

从文件中写入数据

ssize_t write( int fd, const void * buf, size_t count);
参数介绍
fd 对应打开的文件描述符
buf 存放待写入的数据
count 计划一次向文件中写多少数据

2.4 close()

关闭文件

int close( int fd);
参数介绍 :
fd 要关闭的文件描述符

2.5 举例

2.5.1 写文件

 fd:文件描述符,通过编号id可以找到文件,0 标准输入,1标准输出,2标准错误输出

所以fd值为3

2.5.2 读文件

2.6  父进程先打开一个文件,fork 后子进程是否可以共享使用?

2.6.1 文件表

 当不使用file.txt,把三关闭了,如果打开另外一个文件,则继续复用三。(不使用就关闭,这样就不会一直占用,使表不变大)

2.6.2 先open后fork

2.6.1.2 结果:

 父进程打开的文件,子进程也可以访问,并且共享文件偏移量,如果想要关闭文件,需要父子进程都关闭文件。

2.6.1.3原因

父子进程共用一个结构体,引用计数为2,所以文件偏移量+1,那么子进程就输出d,再+1,父进程输出,所以结果出现四个偏移。

2.6.3 先fork后open

2.6.2.2 结果

 

2.6.2.3 原因

 

 因为父和子进程各有一个结构体,打开一个文件,其偏移量并不互相影响,所以都是从a开始。

三、系统调用与库函数的区别

库函数的实现在函数库中,属于用户空间,系统调用的实现在内核中,属于内核空间。

 

相关文章:

Linux Day07

一、僵死进程 1.1僵死进程产生的原因 子进程先于父进程结束, 而父进程没有获取子进程退出码&#xff0c;释放子进程占用的资源&#xff0c;此时子进程将成为一个僵死进程。 在第一个框这里时父进程子进程都没有结束&#xff0c;显示其pid 父进程是2349&#xff0c;子进程是235…...

数字化管理,让MRO工业品更高效

MRO商品数字化是将MRO商品的采购、库存及记录过程进行数字化管理&#xff0c;以提高MRO商品的效率和可控性。MRO&#xff08;Maintenance, Repair and Operations&#xff09;一般用于维修、保养及日常运营工作中&#xff0c;包括五金工具、紧固件、精加工刀具、备品备件、切屑…...

layui中渲染table表格

页面布局 可直接根据文档要求去写 table 组件&#xff08;这个不重要&#xff09; <table lay-filter"SyDictTable" id"SyDictTable" lay-data"{id: SyDictTable}"></table>Js 重要的是去修改JS里面的东西&#xff0c;比如&#…...

2023-08-10LeetCode每日一题(下降路径最小和 II)

2023-08-10每日一题 一、题目编号 1289. 下降路径最小和 II二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数…...

网络基础2(HTTP,HTTPS,传输层协议详解)

再谈协议 在之前利用套接字进行通信的时候&#xff0c;我们都是利用 “字符串” 进行流式的发送接收&#xff0c;但是我们平常进行交流通信肯定不能只是简单的发送字符串。 比如我们用QQ进行聊天&#xff0c;我们不仅需要得到对方发送的消息&#xff0c;还要知道对方的昵称&…...

Java实现籍贯级联选择器

在工作中要求写一个籍贯的级联选择器&#xff0c;记录一下自己写这个级联选择器的过程&#xff0c;因为自己才刚开始工作&#xff0c;有很多地方都没有考虑的很清楚&#xff0c;希望各位大佬能给出建议。 一、需求 A:正常的23个省&#xff0c;籍贯由“省区/县/市”组成&#xf…...

每日一学——OSI参考模型

OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;是国际标准化组织&#xff08;ISO&#xff09;制定的一个网络通信协议的概念框架。它将网络通信划分为七个层次&#xff0c;每个层次负责不同的功能和任务&#xff0c;从物理层到应用层依次为…...

虚幻5中Lumen提供哪些功能以及如何工作的

虚幻引擎 5 中的 Lumen 是一个完全动态的全局照明和反射系统。它可以在虚幻引擎 5 中使用&#xff0c;因此创作者无需自行设置。它是为下一代控制台和建筑可视化等高端可视化而设计的。那么它提供了哪些功能以及如何工作&#xff1f; 全局照明 当光离开光源时&#xff0c;它会…...

Linux C 语言 mosquitto 方式 MQTT 发布消息

1 说明 采用 mosquitto 库&#xff0c;实现对主题发布消息。 其中服务器有做限制&#xff0c;需要对应的 cilent id &#xff0c;cafile 、certfile 、keyfile 等配置 2 开发环境 采用ubuntu 直接编译调试 安装mosquitto 库 sudo apt install libmosquitto-dev sudo apt-ge…...

利用NtDuplicateObject进行Dump

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。&#xff08;本文仅用于交流学习&#xff09; 这是国外老哥2020年提出的一种蛮有意思的思路。 我们先来看看大致的思路是…...

【快应用】list组件如何区分滑动的方向?

【关键词】 list组件、滑动方向、scroll 【问题背景】 有cp反馈list这个组件在使用的时候&#xff0c;不知道如何区分它是上滑还是下滑。 【问题分析】 list组件除了通用事件之外&#xff0c;还提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…...

【深入了解pytorch】PyTorch扩展:如何使用PyTorch的扩展功能

【深入了解pytorch】PyTorch扩展:如何使用PyTorch的扩展功能 PyTorch扩展:展示如何使用PyTorch的扩展功能1. 自定义损失函数2. 自定义数据加载器3. 自定义优化器总结PyTorch扩展:展示如何使用PyTorch的扩展功能 PyTorch作为一个开源的深度学习框架,在研究和应用领域广受欢…...

Vue3——如何实现页面访问拦截

在现代的Web开发中&#xff0c;页面访问拦截是一个非常常见的需求。通过拦截页面访问&#xff0c;我们可以控制用户在访问特定页面之前需要满足的条件&#xff0c;比如登录状态、权限等。Vue是一个非常流行的JavaScript框架&#xff0c;它提供了许多强大的工具和功能&#xff0…...

nginx配置gzip

在 Nginx 中启用 Gzip 压缩可以大幅减少传输内容的大小&#xff0c;从而加快网页加载速度。 打开 Nginx 的配置文件&#xff0c;通常是 /etc/nginx/nginx.conf 或者 /etc/nginx/conf.d/default.conf。找到 http 配置块&#xff0c;在其中添加以下代码来开启 Gzip 压缩&#xff…...

ExtJS教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Ext JS是一个流行的JavaScript框架&#xff0c;它为使用跨浏览器功能构建Web应用程序提供了丰富的UI。 Ext JS基本上用于创建桌面应用程序它支持所有现代浏览器&#xff0c;如IE6 &#xff0c;FF&#xff0c;Chrome&#xff0c;safari 6 等。Ext JS基于MVC / MVVM架构…...

【el-upload】批量上传图片时在before-upload中添加弹窗判断时的踩坑记录

一、初始代码 1. 初始使用组件代码片段 <!-- 上传 --> <DialogUploadFile ref"uploadFile" success"refresh" />// 上传 const uploadHandle () > {if (selections.value.length ! 1) {onceMessage.warning(请选择一条数据操作)return}u…...

【Java基础】- JVM之Dump文件详解

Java基础 - JVM之Dump文件详解 文章目录 Java基础 - JVM之Dump文件详解一、什么是Dump三、为什么需要Dump分析思路 四、Dump记录哪些内容4.1 Java dump 文件的格式和内容段格式行格式 4.2 常用分类heap dump和thread dumpheap dumpthread dump 五、如何生产Dump文件5.1 获取hea…...

基于Vue+wangeditor实现富文本编辑

目录 前言分析实现具体解决的问题有具体代码实现如下效果图总结前言 一个网站需要富文本编辑器功能的原因有很多,以下是一些常见的原因: 方便用户编辑内容:富文本编辑器提供了类似于Office Word的编辑功能,使得那些不太懂HTML的用户也能够方便地编辑网站内容。提高用户体验…...

深入理解 Spring 中的 @RequestBody 和 @ResponseBody 注解及其区别

引言 在现代的 Web 开发中&#xff0c;处理 HTTP 请求和响应是不可或缺的任务。Spring Framework 提供了丰富的功能来简化这些任务&#xff0c;并使开发人员能够更专注于业务逻辑。在本文中&#xff0c;我们将深入探讨 Spring 中的 RequestBody 和 ResponseBody 注解&#xff0…...

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者&#xff1a;乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用&#xff1a;King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...