0,5文件

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
第一个参数:建立映射的起始地址
第二个参赛:建立映射的长度
第三个参赛:映射的访问权限
    PROT_EXEC    可执行
    PROT_READ    可读
    PROT_WRITE    可写
    PROT_NONE    不可访问
    
第四个参赛:具体的操作标志
第五个参赛:文件描述符,默认0
第六个参数:文件中的偏移量,默认0

返回值:成功返回映射首地址,失败返回 MAP_FAILED
函数功能:
    主要用于建立文件/设备到虚拟地址的映射
    


int munmap(void *addr, size_t length);
第一个参数:映射区的首地址,mmap函数的返回值
第二个参数:映射区的大小
函数功能:
    主要用于解除参数指定的映射



************内存管理函数的层次关系
标准c语言:使用malloc申请;使用free释放
 |
POSIX标准:使用sbrk申请;使用brk释放
 |
操作系统:使用mmap建立映射;munmap解除映射
 |
... ...



**********************************************
                文件管理
**********************************************

在linux系统中,几乎所有的一切都可以看作文件,包括目录,输入输出设备

/dev/null:设置空文件

echo hello:表示打印hello字符串

echo hello > a.txt:表示将字符串插入到a.txt文件中(替换,不追加)

cat a.txt:查看文件内容

echo hello > /dev/null:将echo命令执行结果丢弃

cat /dev/null:查看文件内容,哈也没有

cat /dev/null > a.txt:清空文件内容


************
常用的基本操作函数
标c函数:fopen/fclose/fread/fwrite/fseek

UC函数:open/close/read/write/lseek



#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int creat(const char *pathname, mode_t mode);
creat()is equivalent to open() with flags equal to O_CREAT|O_WRONLY|O_TRUNC.


扩展:
   ls -l a.txt的执行结果如下:
    -       rw-      rw-        r--         1  
文件类型 属主权限 属组权限 其他用户权限 硬链接数
  tarena   tarena    0       8月  4 11:38     a.txt
属主名称 属组名称 文件大小 最后一次修改时间 文件名称

其中文件的类型主要有:
    -  表示普通文件
    d  表示目录文件
其中文件的权限主要有:
    r  表示可读  4  
    w  表示可写  2
    x  表示可执行 1
    -  表示没有此权限 0
   因此: 0664 => rw- rw- r-- // 八进制
   
      
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

第一个参数:字符串形式的路径名

第二个参数:具体的操作标识
            O_RDONLY    只读
            O_WRONLY    只写
            O_RDWR        可读,可写
            
            除此之外,还可以按位或一下的标识:
            
            O_APPEND    以追加的方式打开文件
            O_CREAT        文件不存在创建,存在则打开
            O_EXCL        与C_CREAT搭配使用,若不存在则创建,存在则创建失败    
            O_TRUNC        若文件存在,则清空文件的内容;

第三个参数:用于指定新文件创建时的权限信息,如:0664
            当需要创建新文件时,需要该参数; 当打开一个已经存在的文件时,不需要该参数;

返回值:成功返回文件描述符        失败返回-1

函数功能:主要用于打开/创建一个文件



#include <unistd.h>
int close(int fd);
函数功能:主要用于关闭参数指定的文件描述符,让该文件描述符不再代表任何一个文件
        该文件描述符可以被再次使用

返回值:成功返回0 失败返回-1




#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

第一个参数:文件描述符,open函数的返回值
第二个参数:缓冲区的首地址
第三个参数:期望读取的字节数

返回值:成功 返回读取到的字节数;返回0 表示读到文件尾;失败返回 -1
       每次读取到多少字节,则文件读写位置前进多少字节

函数功能:主要用于从参数指定的文件中读取数据;



#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

第一个参数:文件描述符,open函数的返回值
第二个参数:缓冲区/被写入的首地址
第三个参数:期望写入数据的大小

返回值:成功 返回实际写入的字节数;返回0表示什么都没写入;失败返回 -1
       每次写入多少字节,则文件读写位置前进多少字节

函数功能:主要用于将指定的数据写入到指定的文件中



#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

第一个参数:文件描述符,open函数的返回值

第二个参数:用于指定偏移量

    offset > 0:向后偏移,也就是向文件末尾方向
    offset < 0:偏移量为0
    offset = 0:向前偏移,也就是向文件开头方向
    
第三个参数:用于指定起始位置

    SEEK_SET:文件开头位置;向前偏移不合理,报错
    SEEK_CUR:文件当前位置
    SEEK_END:文件末尾位置;向前,向后偏移都合理

返回值:成功:返回偏移后的位置距离开头位置的偏移量;失败返回:-1
函数功能:主要用于调整文件的读写文件


[注意:]
当把文件的读写位置移动到SEEK_END后面的位置写入数据时,文件还是可以写入的;
只是中间有一块区域空间,该区域叫做文件的空间现象,该区域会被计算到文件的大小中;
但是没有有效数据,读取内容时得到'\0'


标C和UC文件操作的比较

由程序结果可知,标C的文件操作函数比UC的文件操作函数效率高些;
因为标C文件操作函数内部提供了输入输出缓冲区,当数据积累一定的之后才会访问内核,
才会将数据写入到文件中,因此效率比较高

可以使用time a.out 查看程序的执行时间

    real:真实时间
    user:用户态时间
    sys: 内核时间

通过自定义缓冲区的方式可以提高UC文件操作函数的 ,但并不是缓冲区越大则效率一定越高


文件描述符的工作原理:

文件描述符本质上是一个整数,可以代表一个打开的文件;
但是文件的信息并不是存放在文件描述符中,而是存放在文件表等数据结构中;
当使用open函数打开文件时,会将文件的相关信息加载到文件表等数据结构中;
但是出于安全和效率等因素考虑,文件表等结构并不适合直接操作,而是给文加表一个指定编号;
拿编号进行操作,该编号就叫做文件描述符;


在每个进程的内部都有一张文件描述符总表,当有新的文件描述符需求时,
会去文件描述符总表中查找最小的未被使用的文件描述符返回,
文件描述符虽然是int类型,单本质上是非负整数,也就是从0开始,其中0 1 2 被系统占用,
分别代表标准输入,标准输出,标准错误,所以一般从3开始使用,最大到OPEN_MAX(1024)


当使用close函数关闭文件时,本质上就是将文件描述符和文件表结构之间的对应关系从文件描述符总表中删除,不一定会立即删除文件,只是当文件表结构没有和其他文件描述符对应(也就是一个文件表结构可以同时和多个文件描述符对应),才会删除文件表;
close函数也不会改变文件符的整数值,而是让该文件描述符无法代表一个文件而已




#include <unistd.h>
int dup(int oldfd);

函数功能:
    主要用于创建参数oldfd的副本,该函数会选择最小的未被使用的描述符作为最小的文件描述符
    成功返回新的文件描述符;失败返回-1
    
    
int dup2(int oldfd, int newfd);
前面的文件描述符替换掉后面的文件描述符;从而生成新的文件描述符,都指向oldfd文件;
即oldfd,newfd,dup2的返回描述符 写入的都是lodfd指向的文件;追加不覆盖

函数功能:
    主要用于实现oldfd到newfd的复制,如果newfd已经被占用则先关闭再复制;
    成功返回新的文件描述符,失败返回-1
    
注意:
    复制文件描述符的本质就是复制文件描述符所对应的文件表地址信息;
    也就是让多个文件描述符对应同一个文件表结构,也就是对应同一个文件;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值