day05 进程映射、malloc实现原理、文件操作

2024-05-05 08:58

本文主要是介绍day05 进程映射、malloc实现原理、文件操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

回忆昨天内容:
一、程序中错误的处理
errno、perror(3)、strerror(3)
二、GDB调试工具的使用
-g/-ggdb  编译参数
三、进程映射
虚拟地址空间    物理地址
物理内存   虚拟内存
在有操作系统支持的cpu访问的是虚拟地址空间。裸板开发可以直接访问计算机的物理地址空间

内核空间    1G
用户空间    3G

代码段、数据段、堆、栈

作业:
大小段的问题
vi big_little.c

今天内容:
一、进程映射(续)
数据段、代码段、栈、


代码参见process_layout.c

代码段:  字符串、常量
数据段:全局变量、静态的局部变量
堆:使用malloc等一系列函数向系统申请的内存空间在堆里
栈:自动局部变量和形参
注意变量的生命周期


二、使用mmap将物理内存映射到进程的虚拟地址空间

需要使用mmap(2)解决映射的问题
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot,\
         int flags,int fd, off_t offset);
功能:映射文件或设备到内存空间
参数:
addr:映射后的虚拟地址空间的地址(一般为NULL)
length:映射的长度
prot:
PROT_NONE  Pages may not be accessed.
PROT_EXEC  Pages may be executed.
PROT_READ  Pages may be read.
PROT_WRITE Pages may be written.

flags:
MAP_SHARED:
MAP_PRIVATE:

MAP_ANONYMOUS:  不支持文件映射
fd:-1
offset:0
返回值:
MAP_FAILED   错误  errno被设置
成功返回映射区域的地址

int munmap(void *addr, size_t length);
功能:解除内存映射
参数:
addr:是mmap(2)的返回值
length:同mmap(2)函数中的length
返回值:
0 成功
-1 失败  errno被设置

举例:使用mmap将物理内存映射到进程的虚拟地址空间
代码参见mmap.c

补充:
linux操作系统下,一切皆文件。文件是文件,设备也是文件。

值-结果参数。就是指针类型的参数,可以带值返回主调函数。


三、malloc的实现原理(缓存机制)
使用代码验证malloc的缓存机制
代码参见mallo.c
0986f000-09890000
0986f-09890  [heap]   33块*4k/块=132k
09ea5-09ec6
090fe-0911f   33
b7541-b7564   35
了解malloc的缓冲机制。系统一次提供最少33块,每块4k。

四、使用系统调用进行文件的操作
使用库函数对文件进行操作:fopen、fclose、fwrite、fread
使用以下系统调用对文件进行操作
open(2)、close(2)、read(2)、write(2)、lseek(2)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

int open(const char *pathname, int flags,...);
...代表可变参数
功能:打开一个文件或者设备
参数:
pathname:指定文件的路径名字
flags:
三选一:
O_RDONLY  :只读方式
O_WRONLY  :只写方式
O_RDWR    :读写方式
file creation flags&file status flags
O_CREAT  :如果文件不存在,则创建文件,需要提供文件的权限。权限的有效性是提供的权限和umask的运算结果
mode & ~umask

O_EXCL   :与O_CREAT一起指定。文件存在报错。

O_TRUNC  :如果文件存在将文件内容清0.

O_APPEND :追加到文件末尾的方式打开文件

mode:
返回值:
-1  错误  errno被设置
返回一个新的文件描述符


文件描述符 非负数 最小的没有被使用的

补充:
-rw-rw-r-- 1 tarena tarena  407  3月 21 11:07 mmap.c

最前边的第一个字符决定了文件的类型
-    普通文件
d    文件夹文件
b    块设备文件
c    字符设备文件
s    socket文件
l    软链接文件
p    管道文件

rw-rw-r--
 u  g  o
    a
u  user  文件的属主
g  group 文件的属组
o  other 其他人
a  all   所有人
0664

umask权限掩码
普通文件创建时,需要将可执行权限去掉。0666
day05$touch a
day05$ls -l a
-rw-rw-r-- 1 tarena tarena 0  3月 21 14:47 a
0664
day05$umask
0002

0666   rw-rw-rw-  110110110    110110110
0002   -------w-  000000010    111111101
0664   rw-rw-r--               110110100

mode&~umask
day05$umask 0033
day05$touch b
day05$ls -l b
-rw-r--r-- 1 tarena tarena 0  3月 21 14:53 b
day05$umask
0033

0666   rw-rw-rw-
0033   ----wx-wx
0644   rw-r--r--

文件描述符:

每个进程都有自己的身份证号。pid
除此之外,每个进程还有自己的户口本。PCB(process control block).PCB中记录了每个进程使用到的计算机的资源的状况。

文件描述符中
0    STDIN_FILENO    标准输入
1    STDOUT_FILENO   标准输出
2    STDERR_FILENO   标准错误输出
close(2)
#include <unistd.h>
int close(int fd);
功能:关闭一个文件描述符
参数:
fd:open(2)的返回值
返回值:
0  成功
-1 错误  errno被设置

举例验证,文件的打开和关闭。
1、以只读方式打开文件。
代码参见read_file.c

2、以读写的方式打开文件,如果文件不存在,创建文件,文件的权限指定为0664.如果文件存在报错。
代码参见  rw_file.c

read(2)
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从一个文件描述符中读取
参数:
fd:指定文件描述符
buf:将读取出来的内容存放到buf指定的空间里
count:指定读取的最大字节数
返回值:
-1  失败  errno被设置
读取到的字节数

write(2)
#include <unistd.h>
ssize_t  write(int fd,const void *buf,size_t count);
功能:向指定的文件里写内容
参数:
fd:指定文件描述符
buf:buf指定的缓存,将这个缓存里的内容写入文件中
count:最多写入的字节数
返回值:
-1 失败 errno  被设置
实际写入文件的字节数

举例验证。编写代码实现cat命令的功能。生成可执行文件mycat。
代码参见mycat.c

cat filename

总结:
一、进程映射(续)
二、使用mmap将物理内存映射到进程的虚拟地址空间
三、malloc的缓冲机制
四、文件的操作  open、read、write、close

作业:
编写代码实现cp命令的功能。生成可执行文件mycp。

这篇关于day05 进程映射、malloc实现原理、文件操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961300

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

SQL Server中,always on服务器的相关操作

在SQL Server中,建立了always on服务,可用于数据库的同步备份,当数据库出现问题后,always on服务会自动切换主从服务器。 例如192.168.1.10为主服务器,12为从服务器,当主服务器出现问题后,always on自动将主服务器切换为12,保证数据库正常访问。 对于always on服务器有如下操作: 1、切换主从服务器:假如需要手动切换主从服务器时(如果两个服务

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt