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

文件操作:系统IO

文件操作

目录

  1. 基本概念
  2. Linux文件特点
  3. 操作方式1-系统IO
  4. 操作方式2-标准IO
  5. 两种操作模式的对比

基本概念

什么是文件

简单的说,文件就是存储在硬件磁盘上的数据集合

文件通过什么来标识?

系统中在处理的文件(读、写操作)的时候,需要唯一能够识别这个文件,就需要一个针对文件的标识,以便在其他地方能识别出这个文件,于是就产生了文件描述符

文件描述符
  • 文件描述符是一些整数,简单的说就是一个文件ID,用于在系统中唯一的标识一个文件。文件描述符的总数也就是系统可以打开文件的最多个数,这取决于系统的配置情况。可打开的文件描述符总数可利用cat /proc/sys/fs/file-max来查看

  • 程序在运行初,系统会默认打开3个文件描述符,分别为标准输入,输出,错误文件描述符,在<unisted.h>中有以下定义:

  • #define STDIN_FILENO 0 // 标准输入设备文件描述符

    #define STDOUT_FILENO 1 // 标准输出设备文件描述符

    #define STDERR_FILENO 2 // 标准错误设备文件描述符

文件类型,访问权限

  1. 文件类型:

    普通文件(-);目录文件(d);链接文件(l);字符设备文件(c);块设备文件(b);管道文件(p);套接字文件(s);

  2. 访问权限:

    读权限(r);写权限(w);可执行权限(x);

Liunx文件特点
  1. 可通过操作系统或者程序对外提供信息,也能对内输入信息,可以被创建,删除;
  2. 为操作系统和设备提供了一个简单而统一的接口;
  3. 普通程序完全可以像使用文件(普通定义)那样使用磁盘文件、串行口、打印机和其他设备;
  4. 硬件设备在linux操作系统中也被表示为文件。

文件操作方式1-系统调用

系统调用,由操作系统直接提供,他们是通向操作系统(内核)本身的接口,针对文件操作来说,系统调用是最直接的方式。

  • int access(const char *path, int mode);
  • int open(const char *path, int oflags);
  • int open(const char *path, int oflags, mode_t mode );
  • ssize_t read(int fd, void *buf, size_t count);
  • ssize_t write(int fd, const void *buf, size_t count);
  • int close(int fd);off_t lseek(int fd, off_t offset, int whence);
  • int stat(const char filename, struct stat buf);
文件操作函数:
1.文件属性
函数名access
头文件#include <fcntl.h>
#include <unistd.h>
函数原型int access(const char *pathname, int mode)
功能确定文件或文件夹是否存在,访问权限
参数说明1. pathname:要操作的文件名或路径,也可以是目录名;
注意:如果Pathname 为目录名,则mode 只能取值 F_OK,用来判断目录是否存在;
2. mode :判断模式,可取值如下:
R_OK:判断文件是否有读权限
W_OK :判断文件是否有写权限
X_OK:判断文件是否有执行权限
F_OK:判断文件是否存在
返回值如果指定的mode 方式有效,返回0,否则返回-1, 错误码放在errno
2.打开文件
函数名open
头文件#include <fcntl.h>
#include <unistd.h>
函数原型int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode );
功能打开或创建文件
参数说明1. pathname:要操作的文件名或路径;
2. flags:文件打开方式,可取值如下:
O_RDONLY:只读
O_WRONLY: 只写
O_RDWR:读写
附加选项:O_APPEND,O_CREAT,O_TRUNC, …3.mode:如果以新建方式打开文件,这个参数用于设置文件的访问权限(详见后续)
返回值如果成功,返回文件描述符,否则返回-1,错误码放在errno
打开文件-后续

S_IRWXU 00700 文件拥有者可读,可写,可执行

S_IRUSR 00400 文件拥有者可读S_IWUSR 00200 文件拥有者可写

S_IXUSR 00100 文件拥有者可执行

S_IRWXG 00070 组用户可读,可写,可执行

S_IRGRP 00040 组用户可读

S_IWGRP 00020 组用户可写

S_IXGRP 00010 组用户可执行

S_IRWXO 00007 其他组用户可读,可写,可执行

S_IROTH 00004 其他组用户可读

S_IWOTH 00002 其他组用户可写

S_IXOTH 00001 其他组用户可执行

3.文件读取
函数名read
头文件#include <fcntl.h>
#include <unistd.h>
函数原型ssize_t read(int fd, void *buf, size_t count);
功能从文件中读取数据
参数说明1.fd:要操作的文件描述符;
2.buf:数据缓冲区,用来临时存放读取到的数据;
3.count:设置要读取的字节数
返回值成功:返回实际读取到的字节数0 ;到达文件尾部,或没有可读的数据出错;返回 -1,并将错误码存入 errno 中
4.文件写入
函数名write
头文件#include <fcntl.h>
#include <unistd.h>
函数原型ssize_t write(int fd, const void *buf, size_t count);
功能写数据到某个文件
参数说明1.fd:要操作的文件描述符;
2.buf:数据缓冲区,临时存放要写入的数据;
3.count:要写入的字节数
返回值成功:返回实际写入到文件的字节数出错;
返回 -1,并将错误码存入 errno 中
5.关闭文件
函数名close
头文件#include <fcntl.h>
#include <unistd.h>
函数原型int close(int fd);
功能关闭已打开的文件
参数说明fd:要操作的文件描述符
返回值成功,返回0,失败返回-1,并将错误码放入 errno
6.文件指针移动
函数名lseek
头文件#include <fcntl.h>
#include <unistd.h>
函数原型off_t lseek(int fd, off_t offset, int whence);
功能移动文件指针
参数说明1.fd:要操作的文件描述符;
2.offset:相对于whence 的偏移量;
3.whence:移动方式,可取以下值:
SEEK_SET: 文件头部
SEEK_CUR: 当前位置
SEEK_END: 文件末尾
返回值成功:返回文件指针的偏移量
出错:返回 -1,并将错误码存入 errno 中
文件映射

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写数据到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。

在这里插入图片描述

7.文件映射
函数名mmap
头文件#include <sys/mman.h>
函数原型void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
功能映射/解除映射 文件存储空间到进程的虚拟地址空间
参数说明1.addr:映射的地址空间首地址,NULL 表示让系统决定;
2.length:地址空间大小
3.prot:映射的地址空间访问方式,必须和文件打开方式匹配
4.flags: 映射的地址空间的访问标记
5.fd: 需映射的文件描述符
6.offset: 文件存储空间的偏移量
注:prot,flags参数相见手册
返回值成功:munmap返回 0 ,mmap 返回映射后的地址;出错:返回 MMAP_FAILED,并将错误码存入 errno 中
文件状态查询
文件状态结构体stat

在这里插入图片描述

常用属性st_mode

在这里插入图片描述

在这里插入图片描述

8.文件状态查询
函数名stat
头文件#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
函数原型int stat(const char path, struct stat buf);
int fstat(int fd, struct stat *buf);
功能获取文件状态,
参数说明1.path:要操作的文件名或路径;
2.buf:指向stat 结构体的指针,用来获取文件状态信息:
3.fd:文件描述符
注:struct stat 见下页 stat 函数用来获取未打开的文件状态信息,fstat 函数用来获取打开的文件状态信息
返回值成功:返回 0出错:返回 -1,并将错误码存入 errno 中
9.获取用户,组用户信息
函数名getpwuid
头文件#include <sys/types.h>
#include <pwd.h>
函数原型struct passwd* getpwuid(uid_t uid);
功能利用用户ID获取用户信息
参数说明uid:用户id
返回值成功:用户信息结构体指针
出错:返回 NULL,并将错误码存入 errno 中
函数名getgrgid
头文件#include <sys/types.h>
#include <grp.h>
函数原型struct group *getgrgid(gid_t gid);
功能利用用户组ID获取用户组信息
参数说明gid:用户组id
返回值成功:用户组信息结构体指针
出错:返回 NULL,并将错误码存入 errno 中

http://www.kler.cn/a/507611.html

相关文章:

  • OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用
  • 【设计模式-结构型】装饰器模式
  • 如何在vue中渲染markdown内容?
  • 【Block总结】掩码窗口自注意力 (M-WSA)
  • My ICLR Learning-Feedback
  • 2025 年前端开发学习路线图完整指南
  • 【Linux】gdb_进程概念
  • 算法(蓝桥杯)贪心算法7——过河的最短时间问题解析
  • Spring-boot3.4最新版整合swagger和Mybatis-plus
  • 探索Node.js的Net模块:构建强大网络应用的基石
  • Ubuntu、Windows系统网络设置(ping通内外网)
  • 【全开源】跑腿小程序:智能派单、同城配送、校园跑腿及预约取件(用户端+骑手端)
  • 回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测
  • 图数据库 | 19、高可用分布式设计(下)
  • mybatis延迟加载、缓存
  • MongoDB 学习指南:深入探索非关系型数据库
  • mongodb详解二:基础操作
  • Windows系统安装 Rust 及其配置
  • FFCA-YOLO模型详解
  • 站点服务器和节点服务器的区别是什么?
  • vant组件库的按需导入导出
  • 深入了解 systemd:Linux 系统的启动与管理大师
  • Python基础02(Python序列结构/列表/元组/集合/字典/序列解包)
  • 计算机基础专业课
  • AI写作大模型一体机赋能行业新应用场景
  • redis 分布式重入锁