day06内存管理、文件管理

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表示写入错误;
    写入多少字节则文件读写位置前进多少字节;
函数功能:
主要用于将指定的数据写入到指定的文件中;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值