本文主要是介绍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实现原理、文件操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!