进程地址空间

引入地址空间

静态变量和栈空间变量

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

静态变量默认是被初始化的
存放在初始化和为初始化空间中
static已经变成了全局变量

命令行参数和环境变量的增长方向

这里观察的是命令行参数环境变量的地址
在这里插入图片描述
在这里插入图片描述


观察命令行和环境变量表的地址
在这里插入图片描述
在这里插入图片描述

进程地址空间

在这里插入图片描述

在这里插入图片描述

如果他们是同一块儿空间,为什么打印的结果却不一样呢,我们知道肯定是父进程先跑完,在子进程进程输出的时候a应该是1才对——我们看到的只是虚拟地址空间


在这里插入图片描述

1.子进程是父进程的拷贝,(父子进程代码和数据是共享的,只有在数据进行改变时才进行写时拷贝,子进程继承父进程的pcb里的大部分内容,地址空间,页表,并且继承的时候每个页表对应的权限默认为只读的状态)他们通过页表进行映射到物理内存,物理内存由操作系统进行管理
2.因为进程之间是独立的,他们本来对应的是相同的物理内存,但是当有一方进行改变的时候,就需要将发生改变的那一方进行拷贝(写时拷贝),更改页表的指向,指向新的物理空间


页表是有权限的

对数据的权限限制有r,w,rw,一般默认为r
在这里插入图片描述
在这里插入图片描述
字符串存在常量区,权限是只读的,操作系统检测到要修改变量,就会产生报错


在这里插入图片描述

在这里插入图片描述

加const是为了增强代码的安全性,错误早发现早处理


在父进程数据拷贝给子进程的时候,会将页表权限rw->r,因为子进程是父进程的拷贝,页表也会单独有一份,父进程和子进程的页表都会发生改变;当其中有一方进行修改数据,但是检测到页表对应的数据是只读的,此时os将介入,重新开辟空间,将原来的数据拷贝过来,再进行修改,完成后权限就会到了rw(缺页中断)

进程终止

进程退出状态:
1:代码执行完,结果正确
2:代码执行完,结果错误
3:代码没执行完,进程异常
只有代码执行完的退出结果才是有意义的


主函数退出——退出码

进程终止会有一个返回值(return)——表示退出情况,0表示成功,非0表示失败发生错误
使用echo $?观察最后一次退出情况

在这里插入图片描述

第一次:139表示出错
第二三次:0表示正常退出
因为这个命令记录的是最后一次的退出情况,我们明白命令也是一种程序,echo是正常运行的,所以返回0


其他函数退出——错误码

调用库函数,错误码错误码保存在errno
调用自己的函数,普通函数的返回值一般表示的是函数的结果,特殊情况下,错误码需要自己设置
在这里插入图片描述
在这里插入图片描述
通过errno的方式观察库函数的错误码


进程异常

本质:收到异常信号
在这里插入图片描述
每种信号都是一个宏,每个信号都是不一样的


exit & _exit

exit是库函数
_exit是系统调用
在这里插入图片描述
exit中的参数表示返回的退出码

_exit不会刷新缓冲区
在这里插入图片描述

在这里插入图片描述
exit会刷新缓冲区
在这里插入图片描述
在这里插入图片描述

证明缓冲区不是在系统中的

进程等待

在这里插入图片描述

wait

等待任意一个进程
父进程等不到就卡死
在这里插入图片描述
我们能看到,父进程一直在等待,子进程一直在运行


waitpid

等待特定的pid在这里插入图片描述在这里插入图片描述

exit的参数是1可是为什么status返回的是256呢
在这里插入图片描述
status存的信息是错误码+信号


父进程和子进程fork之后谁先运行取决于调度器

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

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

相关文章

Ubuntu22.04 交叉编译fdk-aac for Rv1106

一、下载fdk-aac git clone https://github.com/mstorsjo/fdk-aac.git 二、编译 mkdir build cd buildcmake -DCMAKE_CXX_COMPILER/opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g -DCMAKE_C_COMPILER/opt/arm-rockchip830-linux-…

软件测试——集成测试

集成测试是在单元测试之后,将各个独立单元(通常是已经通过单元测试的模块或组件)组合在一起,测试它们在一起协同工作的过程。以下是进行集成测试的一般步骤和最佳实践: 1. 明确定义集成测试的目标 确定集成测试的目标…

麒麟v10 数据盘初始化 gpt分区

麒麟v10 数据盘初始化 gpt分区 1、查看磁盘 lsblk2 、分区 parted2.1、 设置磁盘分区形式2.2、 设置磁盘的计量单位为磁柱2.3、 分区2.4、 查看分区 3、分区格式化4、 挂载磁盘4.1、新建挂载目录4.2、挂载磁盘4.3、查看挂载结果 5、设置开机自动挂载磁盘分区5.1、 查询磁盘分区…

ClamAV开源病毒库使用例子

ClamAV是一个开源的反病毒引擎,用于检测恶意软件和病毒。ClamAV提供了一个名为cl_scanfile的函数,用于扫描单个文件是否包含病毒。以下是一个使用cl_scanfile函数的示例代码: 首先,确保已经安装了ClamAV库。在Debian/Ubuntu系统中…

用AI来纠正错别字和修饰文字

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 在使用谷歌翻译或百度翻译将英语翻译成中文时,有些句子读起来不太流畅。我尝试使用AI来帮助我修改翻译后的中文,希望能让句子更符合中文习惯。 使用百度文心一言尝试一下。 文心一言的链接是这个&#x…

VUE3给table的head添加popover筛选、时间去除时分秒、字符串替换某字符

1. VUE3给table的head添加popover筛选 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…

RHEL/CentOS的firewalld防火墙服务配置

从 RHEL/CentOS 7开始&#xff0c;使用新的防火墙服务——firewalld。这里介绍该防火墙服务的基本用法 一、防火墙服务管理&#xff1a;从 RHEL/CentOS 7开始采用Systemd作为新的系统管理器&#xff0c;而systemctl则是Systemd中用于管理服务的命令 # 启动防火墙服务 systemct…

谷歌Gemini刚发就惹质疑:测试标准有失偏颇,效果视频疑似剪辑

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌憋了许久的大招&#xff0c;双子座Gemini大模型终于发布&#xff01;其中一图一视频最引人注目&#xff1a; 一图&#xff0c;MMLU多任务语言理解数据集测试&#xff0c;Gemini Ultra不光超越GPT-4&#xff0c;甚至超越了…

OpenGL学习资料

1.学习网站 Song Ho Ahn LearnOpenGL GAMES101:现代计算机图形学入门 OpenGL 官网 2.书籍 Fundamentals of computer graphics OpenGL ES 3.0编程指南 计算机图形学(OpenGL版)第3版 3.参考的一些文章 颜色缓冲区 深度缓冲 VBO&#xff0c;VAO和EBO详解 深入探索透视投影变…

实战干货!基于ERNIE Bot SDK的数字诗人聊天开发教程

随着人工智能技术的不断迭代发展&#xff0c;数字人的开发与应用需求也与日俱增&#xff0c;并且随着大语言模型的发展&#xff0c;数字人也更智能&#xff0c;从最初的语音预制到现在的实时交流&#xff0c;目前已在很多场景都有广泛应用。 虚拟客服&#xff1a;数字人可以通…

Mysql自动备份脚本(本地备份、远程备份、删除冗余备份)

Mysql自动备份脚本&#xff08;本地备份、远程备份、删除冗余备份&#xff09; 1. 脚本功能 自动备份mysql数据到服务器上&#xff0c;可以通过linux的 crontab定义备份周期。 自动删除七天前的备份数据。 2. 脚本内容 #!/bin/bash # auth Eric source /etc/profile # 设…

【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法

近日&#xff0c;阿里云人工智能平台PAI与华南理工大学朱金辉教授团队、达摩院自然语言处理团队合作在自然语言处理顶级会议EMNLP2023上发表基于机器翻译增加的跨语言机器阅读理解算法X-STA。通过利用一个注意力机制的教师来将源语言的答案转移到目标语言的答案输出空间&#x…

计算机网络高频面试八股文

目录&#xff1a; 网络分层结构三次握手两次握手可以吗&#xff1f;四次挥手第四次挥手为什么要等待2MSL&#xff1f;为什么是四次挥手&#xff1f;TCP有哪些特点&#xff1f;说说TCP报文首部有哪些字段&#xff0c;其作用又分别是什么&#xff1f;TCP和UDP的区别&#xff1f;…

套接字应用程序

这章节是关于实现 lib_chan 库的 。 lib_chan 的代码在 TCP/IP 之上实现了一个完整的网络层&#xff0c;能够提供认证和Erlang 数据流功能。一旦理解了 lib_chan 的原理&#xff0c;就能量身定制我们自己的通信基础结构&#xff0c;并把它叠加在TCP/IP 之上了。 就lib_chan 本身…

MMLM之Gemini:《Introducing Gemini: our largest and most capable AI model》的翻译与解读

MMLM之Gemini&#xff1a;《Introducing Gemini: our largest and most capable AI model》的翻译与解读 导读&#xff1a;2023年12月6日&#xff0c;Google重磅发布大规模多模态模型Gemini&#xff0c;表示了Google语言模型发展到了一个新阶段&#xff0c;其多模态和通用能力明…

中断、异常和系统调用(2-1,2-2,2-3)

2-1 课堂练习2.1&#xff1a;外部中断 本实训分析 Linux 0.11 对外部中断的响应和处理过程。在每条指令执行的末尾&#xff0c;如果没有关中断&#xff0c;CPU 会检查是否收到了外部中断信号&#xff0c;如果有信号&#xff0c;则 CPU 就切换到核心态去执行对应的中断处理程序…

Android 获取进程名称

Android 获取进程名称 本篇文章主要获取下当前应用的进程名称,具体代码如下: public static String getProcessNameDevice(final Context context) {int myPid Process.myPid();if (context null || myPid < 0) {return "";}ActivityManager.RunningAppProces…

DHTMLX Scheduler PRO 6.0.5 Crack

功能丰富的 JavaScript调度程序 DHTMLX Scheduler 是一个 JavaScript 日程安排日历&#xff0c;具有 10 个视图和可定制的界面&#xff0c;用于开发任何类型的日程安排应用程序。 DHTMLX JS 调度程序库的主要特性 我们的 JS 调度程序最需要的功能之一是时间轴视图。借助时间轴…

vue-loader是如何工作的?

什么是单文件组件&#xff1f; 单文件组件是一种将模板、脚本和样式封装在一个 .vue 文件中的方式 例如&#xff1a; <template><div class"example">{{ msg }}</div> </template> <script>export default {data() {return {msg: &qu…

【语义分割数据集】——imagenet语义分割

地址&#xff1a;https://github.com/LUSSeg/ImageNet-S 1 例图 2. 类别和数量信息 疑问 根据原文的描述&#xff1a;Based on the ImageNet dataset, we propose the ImageNet-S dataset with 1.2 million training images and 50k high-quality semantic segmentation annot…