文件操作:系统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.rhkb.cn/news/3395.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…

windows 搭建flutter环境,开发windows程序

环境安装配置&#xff1a; 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后&#xff0c;随便找个地方解压&#xff0c;然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了&#xff0…

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…

构建一个简单的深度学习模型

构建一个简单的深度学习模型通常包括以下几个步骤&#xff1a;定义模型架构、编译模型、训练模型和评估模型。下面是一个使用Keras&#xff08;TensorFlow的高级API&#xff09;构建和训练一个简单的全连接神经网络&#xff08;也称为多层感知器&#xff0c;MLP&#xff09;的示…

linux下的NFS和FTP部署

目录 NFS应用场景架构通信原理部署权限认证Kerberos5其他认证方式 命令serverclient查看测试系统重启后自动挂载 NFS 共享 高可用实现 FTP对比一些ftp服务器1. **vsftpd (Very Secure FTP Daemon)**2. **ProFTPD (Professional FTP Daemon)**3. **Pure-FTPd**4. **WU-FTPD (Was…

Python操作Excel——openpyxl使用笔记(3)

3 单元格基本操作 3.1 访问单元格和读写其内容 在前面的例子中&#xff0c;已经简单演示过了向单元格中写入和读取数据。这里进一步提供访问单元格的一些方法。和前面一样&#xff0c;使用工作表的索引方式&#xff0c;可以快速定位一个单元格&#xff1a; import openpyxl w…

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…

一、1-2 5G-A通感融合基站产品及开通

1、通感融合定义和场景&#xff08;阅读&#xff09; 1.1通感融合定义 1.2通感融合应用场景 2、通感融合架构和原理&#xff08;较难&#xff0c;理解即可&#xff09; 2.1 感知方式 2.2 通感融合架构 SF&#xff08;Sensing Function&#xff09;&#xff1a;核心网感知控制…

头盔识别技术

本项目参考b站视频https://www.bilibili.com/video/BV1EhkiY2Epg/?spm_id_from333.999.0.0&vd_source6c722ac1eba24d4cbadc587e4d1892a7 1.下载miniconda 使用 Miniconda 来管理 Python 环境&#xff08;如 yolov8&#xff09;&#xff0c;就可以通过 conda create -n y…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

PCL 新增自定义点类型【2025最新版】

目录 一、自定义点类型1、前言2、定义方法3、代码示例二、合并现有类型三、点云按时间渲染1、CloudCompare渲染2、PCL渲染博客长期更新,本文最近更新时间为:2025年1月18日。 一、自定义点类型 1、前言 PCL库自身定义了很多点云类型,但是在使用的时候时如果要使用自己定义的…

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

ICC和GCC编译器编译Openmp程序的运行区别

1、背景介绍 硬件和隔核设置&#xff1a; Intel E5 V4 14核。 配置 isolcpus2,3,4,5,6,7,8,9,10,11,12,13&#xff0c;隔离了 12 个核心&#xff0c;仅保留核心 0 和核心 1 作为普通调度核心。 操作系统 湖南麒麟3.3-3B OpenMP并行配置&#xff1a; 使用核心 4 到核心 …

改进果蝇优化算法之一:自适应缩小步长的果蝇优化算法(ASFOA)

自适应缩小步长的果蝇优化算法(ASFOA)是对传统果蝇优化算法的一种重要改进,旨在克服其后期种群多样性不足、容易过早收敛和陷入局部最优等问题。有关果蝇优化算法的详情可以看我的文章:路径规划之启发式算法之二十七:果蝇优化算法(Fruit Fly Optimization Algorithm,FOA…

ubuntu22.04安装注意点

换源方式 22.04默认使用/etc/apt/sources.list而非/etc/apt/sources.list.d # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse # deb-src https…

C#表达式和运算符

本文我们将学习C#的两个重要知识点&#xff1a;表达式和运算符。本章内容会理论性稍微强些&#xff0c;我们会尽量多举例进行说明。建议大家边阅读边思考&#xff0c;如果还能边实践就更好了。 1. 表达式 说到表达式&#xff0c;大家可能感觉有些陌生&#xff0c;我们先来举个…

LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS

题目 大型语言模型是人类级别的提示工程师 论文地址&#xff1a;https://arxiv.org/abs/2211.01910 项目地址&#xff1a;https://github.com/keirp/automatic_prompt_engineer 摘要 通过对自然语言指令进行调节&#xff0c;大语言模型 (LLM) 显示了作为通用计算机的令人印象深…

基础入门-反弹Shell渗透命令Reverse反向Bind正向利用语言文件下载多姿势

知识点&#xff1a; 1、反弹Shell-项目&命令&语言等 2、系统渗透命令-网络&文件&操作等 一、演示案例-反弹Shell-自带命令&语言代码&三方项目 1、反弹Shell的前提条件 已知存在的漏洞利用或执行命令的地方 2、为什么要反弹Shell? 往往由于很多因…

AI在SEO中的关键词优化策略探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐重塑搜索引擎优化&#xff08;SEO&#xff09;行业。AI技术的快速发展使得SEO策略发生了翻天覆地的变化&#xff0c;特别是在关键词优化方面。关键词优化的基本概念是通过选择与用户搜索意图密…

DeepSeek-v3在训练和推理方面的优化

1. 基础架构&#xff1a;MLA&#xff0c;大幅减少了KV cache大小。&#xff08;计算量能不能减少&#xff1f;&#xff09; 2. 基础架构&#xff1a;MoE&#xff0c;同等参数量&#xff08;模型的”能力“&#xff09;下&#xff0c;训练、推理的计算量大幅减少。 3. MoE的load…