• Linux系统编程-文件


    1、系统编程介绍以及文件基本操作

    系统编程是基于Linux封装好的一些函数,进行开发。

    Linux文件信息属性在indoe和block的数据结构里,文件的长度和它在磁盘上的存放地点也保存在inode里。inode结构体和inode编号一一对对应。系统使用的是文件的inode编号。 ls -i 可以看到inode编号和文件名的对应情况。综上,文件结构分为inode和block两部分。

    inode结构体(保存文件属性) block(报文文件内容)
    用于存储文件的各属性,包括:
    所有者的信息:文件的owner,group;
    权限信息:read write 和excite
    时间信息:建立或改变的时间(ctime)、最后读取时间(atime)、最后修改时间(mtime);
    标志信息:一些flags;
    内容信息:type,size,以及相应的block的位置信息。
    注意:inode不记录文件名或目录名,文件名或目录名记录在文件所在目录对应的block里。

    创建目录或文件:
    当创建一个目录时,文件系统会为该目录分配一个inode和至少一个block,该inodejilu该目录的属性,并指向那块block,该block记录该目录下相关联文件或目录的inode编号和名字。
    当创建一个文件时,文件系统会为该文件分配至少一个inode和与该文件大小相对应的数量的block。该inode记录该文件的属性,并指向block。
    通过ls -i查询发现,一般情况下,目录的文件的大小都是4096byte,对应的是一个block的大小,如果一个目录中的文件数太多,以至于1个block容纳不下这么多文件时,Linux的文件系统会为该目录分配更多的block
    在这里插入图片描述
    普通文件的大小是该文件大小相对应的数量的block的Size。

    文件编程系统调用

    文件的系统调用接口和Stdio库文件接口在Linux系统中的位置。
    在这里插入图片描述

    文件操作是通过操作系统提供的系统调用实现对文件的创建、访问、编辑、删除等操作。
    文件相关的基本系统调用如下:

    open 打开一个文件来读写或创建一个空文件
    creat 创建一个空文件
    close 关闭以前打开的文件
    read 从文件中读数据
    write 写数据到文件中
    /font>
    可以通过man 2 open 查询系统调用的使用方法,按q退出。

    文件基本读写练习

    每次读取文件data的10个字节,直到读取到文件结尾,并打印出来。

    2、文件描述符以及大文件拷贝

    文件描述符

    open的返回值是int型的文件描述符
    文件描述符的概念:
    一个运行中的程序被称为一个进程,他又一些与之相关的文件描述符,文件描述符是一些小的、正整数数值的数,通过他们可以访问打开的文件和设备。
    文件描述符是打开文件的进程与文件之间的连接;
    文件描述符是一个正整数的值(文件访问的一个句柄);
    同时打开几个文件,描述符不相同;
    一个文件打开多次,描述符也不相同。

    #include 
    /* Standard file descriptors*/
    #define STDIN_FILENO 	0		/*标准输入*/
    #define STDOUT_FILEENO 	1		/*标准输出*/
    #define STDERR_FILENO	2		/*标准错误输出*/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    open 系统调用:建立了一条到文件或设备的访问路径。功能为打开或创建文件。

    O_RDONLY 只打开文件
    O_WRONLY 只写打开文件。
    O_RDWR 写打开文件

    以下具体使用规则参见man手册
    O_CREAT 按mode中出的向方式创建文件
    O_EXCL 査文件是否存在(配合O_CREAT参数使用)。
    O_TRUNC 强制创建文件(与O_CREAT参数配合使用时)。
    O_APPEND open函数打开文件后,自动调整读写指针指向文件尾。

    使用open函数在创建一个bbb文件,并指明其权限为664.

    #include 
    #include 
    #include 
    #include 
    
    int main(int argc,char *argv[])
    {
    	//使用open函数在桌面上创建一个bbb文件,并指明其权限为664
    	int fd = open("/home/hegf/Desktop/bbb",O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
    	printf("first create bbb fd=%d\n",fd);
    
    	//O_EXCL 	检查文件是否存在(配合O_CREAT参数使用,如果文件已经存在,则返回-1)
    	fd = open("/home/hegf/Desktop/bbb",O_EXCL|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
    	printf("second create bbb fd=%d\n",fd);
    
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    open与create对比练习,标准输入输出文件描述符练习

    大文件拷贝对比试验

    方法一:一个字节为单位进行拷贝
    方法二:使用一个1024个字节的buf作为拷贝的缓存(重点掌握)

    3、文件实战练习

  • 相关阅读:
    npm install报错,常见的解决方案
    程序员的七夕怎么过?不会是写代码吧
    Linux性能优化 - CPU优化
    2023-简单点-IOU计算
    【狂神说Java】Mybatis学习笔记(下)
    LeetCode 449. Serialize and Deserialize BST【树,BFS,DFS,栈】困难
    【图数据库实战】HugeGraph图计算流程
    《网络协议》05. 网络通信安全 · 密码技术
    业务逻辑漏洞
    漫谈固态硬盘SSD全生命周期的质量管理
  • 原文地址:https://blog.csdn.net/cai88453626/article/details/133252535