当前位置: 首页 > news >正文

Linux 学习笔记(十五)—— 基础IO

引子:

  • 文件 = 内容 + 属性
  • 文件分为:打开的文件 (进程打开)、 没打开的文件(存储在磁盘中)
  • 打开的文件一定在内存中,因为CPU只能和内存进行互动。如果要管理打开的文件,那么必定存在包含文件属性等信息的文件结构体

一、C语言文件接口回顾

#include <stdio.h>    ——  标准输入/输出头文件

FILE * fopen(const char* path, const char* mode);        ——  打开文件,返回文件指针,输入文件路径(如果只有文件名,默认为当前进程的当前路径cwd),打开方式”w“,"r","a"等;

  • 如果以"w"方式打开,如果路径下该文件不存在,会自动创建这个文件,并且会清空该文件从头开始写; ——  本质上和输出重定向">"是一样的;
  • 改变工作路径"#include<unistd.h>  int chdir(const char * path)"
  • "a":(writing at end of file)文件不存在也会创建文件;——  本质上和追加重定向">>"是一样的;

int fclose(FILE * fp);          ——  关闭文件,关闭成功返回0;

size_t fwrite(const void* ptr[写入内容的起始地址], size_t size[基本大小,如果是字符串最后的'\0'不要传进去,以‘\0’作为字符串结尾是C语言字符串的特殊规定,文件不是这样规定的,加进去会乱码], size_t nmemb[基本大小的个数], FILE* stream[写入的文件指针]);   

二、系统IO理解

文件其实是在磁盘上的,磁盘是外部设备,因此访问任意磁盘文件本质上就是在访问硬件;而用户不可能越过操作系统和驱动直接访问硬件,因此所有的语言的库函数,只要是涉及到访问硬件的,函数内部一定都封装了系统调用接口;

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char* pathname, int flags[模式,O_RDONLY  / O_WRONLY / O_RDWR / O_CREAT / O_APPEND], mode_t mode[文件权限]);       

  • 系统接口:open a file or device

  • O_RDONLY  / O_WRONLY / O_RDWR / O_CREAT / O_APPEND:这些对应的是宏,具体就是一串二进制序列,只有一个为1,这样就可以实现用一个数字同时传递多个选项(通过按位或的方式);

  • int fd = open("log.txt", O_WRONLY);如果“log.txt”这个文件不存在,那么就会打开失败(返回“-1”)不会自行创建;int fd = open("log.txt", O_WRONLY | O_CREAT);这样就会自行创建了;但是这样创建出来的文件的权限不会是你想要的,如果想要创建想要的文件权限,就要用上“mode”这个参数;int fd = open("log.txt", O_WRONLY | O_CREAT,0666);这样就可以自行设置创建文件的权限了;

  • 但上述文件权限设置方法,会被权限掩码“umask”过滤,如果不想要设置的权限被掩码过滤,可以使用

    #include <sys/types.h>    #include <sys/stat.h>    mode_t umask(mode_t mode)

    修改当前进程的文件权限掩码,umask(0);

  • open()的返回值,fd(int)是文件描述符;

#include <unistd.h>

ssize_t write(int fd, const void* buf, size_t count);

  • 系统接口:write to a file descriptor;
  • 示例:const char* message = "hello file system call \n";    write(fd, message, strlen(message));
  • 此时的写入是从文件的起点开始写,但并不会清空原文件的内容;如果想要清空原文件,需要在open()函数的flag参数再加上O_TRUNC;同理,如果想要在后面加上内容就用“O_APPEND” ;

#include <unistd.h>

ssize_t read(int fd, const void* buf, size_t count);

  • 系统接口:read from a file descriptor;
  • count是缓冲区的大小;

#include <unistd.h>

int close(int fildes);

  • 系统接口:close a file descriptor;

三、访问文件的本质

操作系统会使用“struct file”描述一个被打开文件的信息,以便进行管理,类似于进程的PCB;该结构体直接或间接包含:文件路径、文件基本属性(权限、大小、读写位置、打开用户)、文件的内核缓冲区信息、struct file* next;

进程PCB中会有一个“struct file_struct* files”的指针,它指向一个包含指针数组的结构体(文件描述符表),该数组中的指针指向所有被该进程打开的文件的文件描述结构体“struct file”,而上述系统接口中的返回值“int fd”就是这个数组的下标;该数组元素第0,1,2个指针默认指向标准输入/输出/错误流;

C语言里面的“FILE”是C库自己封装的结构体,因为操作系统进程访问文件是通过文件描述符“int fd”的,因此可以肯定FILE结构体里包含了fd(FILE->_fileno);

一个文件可以被多个进程打开,因此struct file结构体里会包含一个叫“引用计数count”的字段;进程关闭文件,只会将文件的count减1,并将文件描述符表中的对应指针置空,如果count不为0就不需要其它操作了,如果count为0系统才需要回收资源;

相关文章:

  • OpenCV_自定义线性滤波(filter2D)应用详解
  • C# CS1612 尝试修改集合中值类型的情况
  • Android常用C++特性之std::equal
  • TCP\IP标准与OSI标准
  • Springboot项目在win系统开发部署到linux服务器出现上传文件编码问题
  • Linux下的git开篇第一文:git的意义
  • 探索基于知识图谱和 ChatGPT 结合制造服务推荐前沿
  • MyBatis 动态 SQL 使用指南
  • react 常用hooks封装--useReactive
  • 【Y004】基于springboot+vue实现的图书管理系统
  • 利用 Page Visibility API 优化网页性能与用户体验
  • babylon.js-1:入门篇
  • 活体检测标签之2.4G有源RFID--SI24R2F+
  • 计算机毕业设计 基于Python的音乐平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • SQL学习1
  • CAP 一致性协议及应用解析
  • js数组之filter
  • LeetCode18.四数之和 JavaScript
  • Making An Indicator With Pure CSS
  • nginx 负载服务器优化
  • Redash本地开发环境搭建
  • Spark学习笔记之相关记录
  • SpingCloudBus整合RabbitMQ
  • SpriteKit 技巧之添加背景图片
  • STAR法则
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 给Prometheus造假数据的方法
  • 如何使用 JavaScript 解析 URL
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 算法之不定期更新(一)(2018-04-12)
  • 小而合理的前端理论:rscss和rsjs
  • 译有关态射的一切
  • 鱼骨图 - 如何绘制?
  • 选择阿里云数据库HBase版十大理由
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)Nginx简介和安装教程
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++17) std算法之执行策略 execution
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (纯JS)图片裁剪
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (南京观海微电子)——COF介绍
  • (四)linux文件内容查看
  • (一)Docker基本介绍
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)