1.内存管理技术
1.1 内存管理的相关函数
(1)brk函数
#include <unistd.h>
int brk(void *addr);
函数功能:
主要用于调整动态内存的大小,具体的调整方式如下:
当addr > 原来的末尾地址时,表示申请动态内存;
当addr = 原来的末尾地址时, 表示动态内存不变;
当addr < 原来的末尾地址时, 表示释放动态内存;
注意:
- 虽然brk函数既能申请动态内存, 又能释放动态内存,但是释放动态内存更加方便, 所哟一般与sbrk函数
搭配使用, sbrk用于申请内存,brk用于释放内存;
练习:
使用sbrk函数申请内存,使用brk函数释放内存, 首先申请一个int 类型大小的动态内存, 存放数据66, 再申请一个double类型的动态内存,存放存放数据3.14,再申请10 个字节大小的字符串空间, 存放数据“hello”, 打印相关数据,最后释放所有动态内存。
(2)mmap函数(暂时了解)
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
第一个参数:建立映射的起始地址, 给NULL表示系统内核指定;
第二个参数:建立映射的长度;
第三个参数:映射的访问权限;
PROT_EXTC - 可执行
PROT_READ - 可读
PROT_WRITE - 可写
PROT_NONE - 不可访问
第四个参数:具体的操作标志;
MAP_SHARED - 映射区的数据直接反映到文件中
MAP_PRIVATE - 映射区的数据不会反映到文件中
第五个参数:文件描述,暂时给0即可;
第六个参数:文件中的偏移量,暂时给0即可;
返回值:成功返回映射区的首地址, 失败返回MAP_FAILED((void*)-1)
函数功能:
主要用于建立文件/设备到虚拟地址的映射;
(3)munmap函数(暂时了解)
#include<sys/mman.h>
int munmap(void *addr, size_t length);
第一个参数:映射区的首地址, mmap函数的返回值;
第二个参数:映射区的大小;
函数功能:
主要用于解除参数的指定的映射;
1.2 内存管理函数的层次关系
标准c语言 - 使用malloc函数申请, 使用free函数释放;
|
POSIX标准 - 使用sbrk函数申请, 使用brk函数释放;
|
操作系统 - 使用mmap函数建立映射,munmap函数解除映射
2.文件管理
2.1 基本概念
- 在linux系统中,几乎所有的一切都可以看作文件,包括目录、输入输出设备等等;
/dev/null/ - 空设备文件
如:
命令echo - 回显命令
echo hello
=> 表示打印hello字符
echo hello > a.txt
=>表示将hello字符串插入到a.txt文件中,插入成功
cat a.txt
=>表示查看文件a.txt中的内容
echo hello > /dev/null
=>表示将echo命令执行结构丢弃掉
cat /dev/null
=>表示查看文件中的弄容,啥也没有
cat /dev/null > a.txt
=>表示清空文件中的内容
2.2常用的基本操作函数(重中之重)
- 复习标c中学过的函数:
fopen()/fclose()/fread()/fwrite()/fseek();- 学习nc中的函数:
open()/close()/read()/write()/lseek();
(1)open函数
#include <sys/types.h> //types:类型
#include <sys/stat.h> //stat(status):状态
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
第一个参数:字符串形式的路径名
第二个参数:具体的操作标志
必须包含以下三个标志中的一个
O_RDONLY - 只读
O_WRONLY - 只写
O_RDWR - 可读可写
除此之外,还可以按位按或以下标志:
O_APPEND - 以追加的方式打开文件
O_CREAT - 若文件不存在则创建,若存在则打开
O_EXCL - 与O_CREAT搭配使用,若文件不存在则创建,若文件存在则创建失败
O_TRUNC - 若文件存在则清空文件中的内容,
第三个参数:用于指定新文件的创建时的权限信息;
当需要创建新文件是,需要给参数;
当打开一个已经存在的文件时,不需要该参数;
返回值:成功时返回新的文件描述符,失败返回-1;
函数功能:
主要用于打开/创建一个文件
注意:
- creat() return the new file descriptor, or -1 if an error occurred (in which case, errno is set appropriately).
拓展:
ls -l a.txt 的执行结果如下
-rw-rw-r– 1 bbyang bbyang 0 6月 3 14:41 a.txt
- rw- rw- r-- 1 bbyang bbyang 0 6月 3 14:41 a.txt
文件类型 属主权限 属组权限 其他用户权限 硬链接数 属主名称 属组名称 文件大小 最后一次修改时间 文件名称
文件类型主要有:
- 表示普通文件
d 表示目录文件
其中文件的主要权限有:
r - 可读 4
w - 可写 2
x - 可执行 1
- - 表示没有此权限
- 因此: 0664 => rw- rw- -w-
(2)close函数
#include <unistd.h>
int close(int fd);
函数功能:
主要用于关闭参数指定的文件描述符,让该文件描述符不再代表任何一个文件, 该文件描述符可以被再次使用;
——>程序:03close.c
(3)read函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
第一个参数:文件描述符,open函数的返回值
第二个参数:缓冲区的首地址
第三个参数:期望读取的字节数
返回值:成功返回实际读取的字节数,返回0表示读到文件末尾;失败返回-1;
每次读取多少字节,则文件读写位置前进多少字节;
函数功能:
主要功能从参数指定的文件中读取数据;
(4)write函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
第一个参数:文件描述符,open函数的返回值;
第二个参数:缓冲区的首地址,被写入数据的首地址
第三个参数:期望写入的数据大小
返回值:成功返回别写入的字节数,返回0表示没有写入数据;返回0表示写入错误;
写入多少字节则文件读写位置前进多少字节;
函数功能:
主要用于将指定的数据写入到指定的文件中;