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开始。

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

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

 

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

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

相关文章

小红书运营 变现方法总结(精)

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家分享一下小红书运营方面的知识&#xff0c;怎样利用小红书变现&#xff1f;全篇倾情干货输出&#xff0c;认真学习&#xff0c;保证您收获多多。 首先&#xff0c;让我们来分析一下小红书平台的优势。关于卖东西&#xff…

SOLIDWORKS PDM—文件版本的管控

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

解决macOS执行fastboot找不到设备的问题

背景 最近准备给我的备用机Redmi Note 11 5G刷个类原生的三方ROM&#xff0c;MIUI实在是用腻了。搜罗了一番&#xff0c;在XDA上找到了一个基于Pixel Experience开发的ROM&#xff1a;PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal)&#xf…

Python爬虫IP代理池的建立和使用

写在前面 建立Python爬虫IP代理池可以提高爬虫的稳定性和效率&#xff0c;可以有效避免IP被封锁或限制访问等问题。 下面是建立Python爬虫IP代理池的详细步骤和代码实现&#xff1a; 1. 获取代理IP 我们可以从一些代理IP网站上获取免费或付费的代理IP&#xff0c;或者自己租…

Python中执行调用JS的多种方法汇总

1. 写在前面 做爬虫的人大家都知道&#xff0c;现在国内Web或App普遍防护都做的很好&#xff0c;且越有价值的网站这方面越强 再小再弱的网站现在或多或少都要整点反爬 JS在反爬中应用非常广泛&#xff0c;现在做爬虫工程师基本都要懂JS&#xff0c;因为各种JS加密需要逆向&…

网站SSL安全证书是什么及其重要性

网站SSL安全证书具体来说是一个数字文件&#xff0c;是由受信任的数字证书颁发机构&#xff08;CA机构&#xff09;进行审核颁发的&#xff0c;其中包含CA发布的信息&#xff0c;该信息表明该网站已使用加密连接进行了安全保护。 网站SSL安全证书也被称为SSL证书、https证书和…

数字化转型能带来哪些价值?

数字化转型可以为个人、企业和整个社会带来广泛的价值。以下是数字化转型的一些主要优势&#xff1a; 1.提高效率和生产力&#xff1a;重复任务的自动化和简化流程可以提高效率和生产力。这使员工能够专注于更具战略性和增值性的活动。 2.增强的客户体验&#xff1a;数字化转…

8.15黄金能否跌破千九?日内如何稳健布局

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周二&#xff08;8月15日&#xff09;亚洲时段&#xff0c;现货黄金延续低位徘徊&#xff0c;目前交投于1906.01美元/盎司附近&#xff0c;美国财长称耶伦称美国经济处于…

vue + less 实现动态主题换肤功能

文章目录 前言一、前提条件1. 初始化vue项目2. 安装插件 二、新建文件夹主题theme1.style.less文件2.model.js文件3.theme.js文件theme文件夹最终效果 三、修改vue.config.js文件四、页面上的具体使用1. index.vue 页面2. index.vue 页面注意点说明3. index.vue 效果 五、在js中…

空降流量危机?QQ音乐升级架构应对高并发

# 关注并星标腾讯云开发者 # 每周3 | 谈谈我在腾讯的架构设计经验 # 第2期 | 赵威&#xff1a;QQ音乐评论系统如何实现高可用&#xff1f; QQ 音乐自诞生以来&#xff0c;已有多个版本的评论业务系统。最新版本是19年再次全新迭代&#xff0c;基于 tlist 存储&#xff0c;按照发…

SpringBoot复习:(48)RedisAutoConfiguration自动配置类

RedisAutoConfiguration类代码如下&#xff1a; 可以看到在这个类中配置了2个bean: redisTemplate和stringRedisTemplate. 而它通过EnableConfigurationProperties(RedisProperties.class)注解&#xff0c;把配置文件中配置的Redis相关的信息引入进来了&#xff0c;RedisPrope…

FPGA应用学习笔记------系统复位一(同异复位)

要满足复位恢复时间才能正常复位&#xff0c;不然会产生输出准稳态&#xff0c;输出逻辑错误 复位恢复时间只会存在复位释放时刻&#xff0c;不会出现在确立时刻&#xff0c;则不推荐完全异步复位 完全同步复位&#xff0c;肯定是同步于时钟滴&#xff0c;并将总是满足时钟条件…

arcgis pro3.0-3.0.1-3.0.2安装教程大全及安装包下载

一. 产品介绍&#xff1a; ArcGIS Pro 这一功能强大的单桌面 GIS 应用程序是一款功能丰富的软件&#xff0c;采用 ArcGIS Pro 用户社区提供的增强功能和创意进行开发。 ArcGIS Pro 支持 2D、3D 和 4D 模式下的数据可视化、高级分析和权威数据维护。 支持通过 Web GIS 在一系列 …

windows下dll文件的创建详细教程

1、前言 dll文件是啥&#xff0c;就不作过多赘述了。现在直接教大家如何创建与使用dll文件。 本文基于windows系统&#xff0c;使用的编译相关工具为visual studio 2019。 2、创建dll 2.1 创建dll工程 首先打开visual studio&#xff0c;然后选择创建新项目&#xff0c;在搜…

Scratch 之 制作超丝滑 FNF 推条

这个教程是不用画笔的&#xff0c;所以不用担心推条是最后一层了&#xff01; 导入素材 你以为真是这样吗&#xff1f;NO&#xff0c;NO&#xff0c;NO&#xff0c;其实是这样的 没错&#xff0c;中间是空的&#xff01;中间是空的&#xff01;中间是空的&#xff01;&#xf…

云计算-知识点大纲

前言&#xff1a;云计算的基本概念学习&#xff0c;基础知识大纲梳理。 说明&#xff1a;仅仅是知识点的整理&#xff0c;很多内容直接从阿里云、腾讯云、华为云等直接搬运过来的。 云计算 云计算的概念 什么是云计算&#xff1f;百度百科的介绍如下&#xff1a; “云”实…

Layui精简版,快速入门

目录 LayUI之入门 1.什么是layui 2.layui入门 3.自定义模块 4.用户登录 5.主页搭建 LayUI之动态树 main.jsp main.js LayUI之动态选项卡 1.选项卡 main.jsp main.js 2.用户登录 User.java UserDao.java UserAction.java R.java LayUI之用户管理 1.用户查询…

如何实现Excel中多级数据联动

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在类Excel表格应用中&#xff0c;常用的需求场景是根据单元格之间的数据联动&…

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

62、华为昇腾开发板Atlas 200I DK A2配置mmpose的hrnet模型推理python/c++

基本思想&#xff1a;适配mmpose模型&#xff0c;记录一下流水帐&#xff0c;环境配置和模型来自&#xff0c;请查看参考链接。 链接: https://pan.baidu.com/s/1IkiwuZf1anyKX1sZkYmD1g?pwdi51s 提取码: i51s 一、转模型 (base) rootdavinci-mini:~/sxj731533730# atc --mo…