Linux-文件IO

1.open函数     

【1】基本概念和使用

#include <fcntl.h>
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
功能:
   打开或创建文件
   
参数:
  @pathname  //打开的文件名
  @flags     //操作的标志
             
             //必选
             O_RDONLY  //只读
             O_WRONLY  //只写 
             O_RDWR    //读写 
             
            //附加
            O_APPEND  //追加 
            O_CREAT   //文件不存在 创建 
            O_TRUNC   //文件存在  截短为0 
  @mode     一般不用
            当flags中使用了 O_CREAT 时,需要指定 mode   
            mode 0777
                 0666
                 0444                  
返回值:
  成功 文件描述符
  失败 -1 && errno会被设置 

注:创建文件并设置权限

【2】文件创建好后的权限:
  a.指定的mode 
  b.umask  (掩码) //二进制位 --- 遮住 

  最终文件的权限 = ~umask & mode


        0  7   7   7 
      111 111 111  mode
  0 000 000 010
      111 111 101 ~umask 
       ------------
       111 111 101 
         7    7     5

【3】fopen和open的相互转化

fopen             open
r                O_RDONLY 
r+               O_RDWR

w                O_WRONLY|O_CREAT|O_TRUNC 
w+               O_RDWR|O_CREAT|O_TRUNC

a                O_WRONLY|O_APPEND|O_CREAT
a+               O_RDWR |O_APPEND|O_CREAT

2.close 
【1】基本概念

int close(int fd);
功能:
   关闭文件描述符
   以便 再次使用 
参数:
  @fd  要关闭的文件描述符
返回值:
  成功 0
  失败 -1 

【2】文件描述符:
1.非负整型数值 
2.分配原则
  最小未使用   
3.范围 
  0~1023 

3.read函数

#include <unistd.h>
ssize_t  read(int fd,      void *buf, size_t count);
功能: 
    从fd中读数据 ,存到 buf中 
参数:
   @fd 要读取的文件 
   @buf 存放读取到的数据的 内存空间 
   @count 一次要读取的数量(字节)
返回值:
   成功 表示成功读到的字节数 
   失败 -1 && errno 

注:read实现cat

4.write函数

ssize_t write(int fd,const void *buf, size_t count);
功能: 
    把buf中 写到fd中 
参数:
   @fd    要写入的文件 
   @buf   存放数据的 内存空间 
   @count 一次要写入的数量(字节)
返回值:
   成功 表示成功写入的字节数 
   失败 -1 && errno 

注:屏幕读入,屏幕写出

注:read write实现cat

注:read write实现cp

5.lseek函数 

off_t lseek(int fd, off_t offset, int whence);
功能:
     重新定位文件偏移量 
参数:
    @fd      要定位的文件 
    @offset  偏移量 
    @whence  参考点 
               SEEK_SET //相对于文件开头的 
                  offset >=0 
               SEEK_CUR //相对于当前位置
                  offset>=0
                  offset<0   //不能超过这个文件开头
               SEEK_END //相对于文件末尾 
                  offset < 0  //不能超过这个文件开头
                  offset >= 0 //可以  --- 创建 空洞 文件
   
返回值:
   成功 从头的偏移量
   失败  -1 && errno

lseek(fd,0,SEEK_SET); //定位到文件开头 
lseek(fd,0,SEEK_END);

获得文件长度:
off_t len = lseek(fd,0,SEEK_END); //off_t <=> long int

注意:
    1、不支持O_APPEND的追加模式,无法生成空洞文件。
    2、lseek函数执行失败,文件指针还在偏移前的位置。
    3、lseek函数在设备文件上偏移无效。 /dev/video0 
    4、fifo,socket 也不支持lseek的操作。

注:lseek创建空洞文件

6.fdopen函数

FILE *fdopen(int fd,const char *mode);
功能:
   将fd 转换  成 FILE * 
参数:
   @fd    要操作fd
   @mode  打开的模式
返回值: 
   成功 FILE *
   失败 NULL

7.fileno函数

int fileno(FILE *stream);
功能:
    将FILE *转换 为 fd
参数:
   @stream  要转换流指针 
返回值:
   成功 fd 
   失败 - && errno   

注:fdopen,fileno实现标准IO和文件IO转化


  

8.库函数和系统调用对比:
【1】库函数: //标准IO
     优点:
         a.方便,功能多 
         b.可移植性好 
           标准 
     不足:
         c.可能存在 安全性 隐患


【2】系统调用:
     优点:
         a.使用起来,简单 ,功能简单
         b.安全性高 
         c.设备文件 ---- 文件IO      ///dev/video0 ----> fopen();     
     缺点:
         c.很多复杂功能需要自己封装设计
         d.可移植性差 

【3】使用的选择:
  标准IO   --- 可移植性 如果操作只是文本数据 
  文件IO   --- 安全性  操作的是硬件 ---文件IO

操作目录:
目录也是一种文件 
类似 标准IO

9.opendir函数

DIR *opendir(const char *name); 
功能:
    打开目录,关联一个目录流
参数:
  @name  要打开的目录名 
返回值:
  成功 返回DIR *
  失败 NULL & errno

10.readdir函数

struct dirent *readdir(DIR *dirp);
功能:
    读取目录项 
参数:
   @dirp 目录流指针 
返回值:
   成功 struct dirent *
   失败 NULL && errno
struct dirent 
{
    ino_t d_ino; /* Inode number */ 
    off_t d_off; /* Not an offset; see below */
    unsigned short d_reclen;/* Length of this record */
    unsigned char d_type;/* Type of file; not supported by all filesystem types */
    char d_name[256]; /* Null-terminated filename */
}

注意:
   读到文件末尾 NULL

注:readdir实现ls

注:reddir实现普通文件和目录的统计


11.closedir函数

int closedir(DIR *dirp);
   功能:
      关闭目录流
   参数:
      @dirp --- 目录流指针 
   返回值:
      成功 0
      失败 -1 &&errno 

12.chdir函数
chdir ("/home/linux"); "../../"
fopen("1.mp4")
int chdir(const char *path);// /home/linux
功能:
    改变当前程序的工作路径
参数:
    path:改变到的路径
返回值:
    成功 返回0
    失败 返回-1

13.getcwd 函数
char *getcwd(char *buf, size_t size);
功能:
    获得当前的工作路径
参数:
    buf:保存工作路径空间的首地址
    size:保存路径空间的长度
返回值:
    成功返回包含路径空间的字符串首地址
    失败返回NULL

注:getcwd获得当前路径,chdir切换路径(只能文件中更改,终端不需要更改)

14.mkdir 函数
int a  =200;

int mkdir(const char *pathname, mode_t mode);//777  666 --x--x--x
功能:
    创建一个目录
    666-
参数:
    pathname:路径
    mode:
        mode & ~umask  0002
        
返回值:
    成功 返回0
    失败 返回-1

注:创建目录文件

15.rmdir  函数
int rmdir(const char *pathname);
功能:
    删除一个空目录文件
参数:
    pathname:目录文件的名字
返回值:
    成功 返回0
    失败 返回-1

    


   


  


 


   


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19421.html

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

相关文章

flutter 专题四十八 Google发布Flutter 2.0正式版,支持全平台程序构建

今天&#xff0c;Google发布了 Flutter 2.0的正式版本&#xff0c;至2018年Flutter 1.0版本发布以来&#xff0c;在最近的3年的时间礼&#xff0c;Flutter进行了大量的升级以支持更多平台的开发需求。作为 Flutter 的重大升级&#xff0c;Flutter 2.0 增加了对桌面和 Web 应用程…

PowerBI 矩阵 列标题分组显示(两行列标题)

先看效果 数据表如下&#xff1a; 我们在powerbi里新建一个矩阵&#xff0c;然后如图加入字段&#xff1a; 我们就会得到这样的矩阵&#xff1a; 我们在“可视化”->“列”&#xff0c;上双击&#xff0c;输入空格&#xff0c;就能消除左上角的"类别"两字 同理修…

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

LLaMA-Factory DeepSeek-R1 模型 微调基础教程

LLaMA-Factory 模型 微调基础教程 LLaMA-FactoryLLaMA-Factory 下载 AnacondaAnaconda 环境创建软硬件依赖 详情LLaMA-Factory 依赖安装CUDA 安装量化 BitsAndBytes 安装可视化微调启动 数据集准备所需工具下载使用教程所需数据合并数据集预处理 DeepSeek-R1 可视化微调数据集处…

kubernetes源码分析 kubelet

简介 从官方的架构图中很容易就能找到 kubelet 执行 kubelet -h 看到 kubelet 的功能介绍&#xff1a; kubelet 是每个 Node 节点上都运行的主要“节点代理”。使用如下的一个向 apiserver 注册 Node 节点&#xff1a;主机的 hostname&#xff1b;覆盖 host 的参数&#xff1…

【已解决】TypeError: AsyncConnectionPool.__init__(), new install bug, httpx==0.24.1

1&#xff0c;参考社区链接&#xff0c;首先降低gradio版本&#xff0c;降低到4以下&#xff0c;但是也不能降太低&#xff0c;也不能太高&#xff0c;要适中&#xff0c;推荐版本3.39.0 pip install gradio3.39.0 2&#xff0c;下载正确的httpx版本 参考社区链接&#xff0…

基于fastadmin快速搭建导航站和API接口站点系统源码

源码介绍 基于fastadmin快速搭建导航站和API接口站点系统源码 上传源码 设置运行目录为/public 导入 数据库.sql到数据库 设置配置文件application/database.php 后台admin.php 可以自己随意修改本文件名称为后台地址 推荐越复杂越好 账号admin 密码 123456 效果预览

Spring Web MVC入门

目录 学习Spring MVC 一、建立连接 RestController和RequestMapping RequestMapping 使用 访问地址&#xff1a;类路径方法路径 既支持Get请求又支持Post请求 ⭐️指定GET方法类型 &#x1f319;指定POST方法类型 二、请求 1️⃣传递单个参数 2️⃣传递多个参数 ​…

案例-04.部门管理-删除

一.功能演示 二.需求说明 三.接口文档 四.思路 既然是通过id删除对应的部门&#xff0c;那么必然要获取到前端请求的要删除部门的id。id作为请求路径传递过来&#xff0c;那么要从请求路径中获取&#xff0c;id是一个路径参数。因此使用注解PathVariable获取路径参数。 请求方…

mysql的rpm包安装

(如果之前下载过mariadb&#xff0c;使用yum remove mariadb卸载&#xff0c;因为mariadb与rpm包安装的mysql有很多相似的组件和文件&#xff0c;会发生冲突&#xff0c;而源码包安装的mysql不会&#xff0c;所以不用删除源码包安装myqsl&#xff0c;只删除mariadb就可以&#…

内容中台重构企业内容管理流程驱动智能协作升级

内容概要 内容中台作为企业数字化转型的核心基础设施&#xff0c;通过技术架构革新与功能模块整合&#xff0c;重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系&#xff0c;将分散的创作、存储、审核及分发环节纳入统一平台管理。基…

haproxy实现MySQL服务器负载均衡

1.环境准备 准备好下面四台台服务器&#xff1a; 主机名IP角色open-Euler1192.168.121.150mysql-server1openEuler-2192.168.121.151mysql-server2openEuler-3192.168.121.152clientRocky8-1192.168.121.160haproxy 2.mysql服务器配置 1.下载mariadb #下载mariadb [rootop…

数据大屏炫酷UI组件库:B端科技风格PSD资源集

一个既精准传达数据内涵&#xff0c;又极具视觉冲击力的UI设计&#xff0c;无疑是提升用户体验、彰显品牌科技实力的关键。但面对如此高要求&#xff0c;UI设计师们往往面临着寻找高质量设计素材的巨大挑战。为此&#xff0c;我们精心打造了这款数据大屏炫酷UI组件库&#xff0…

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…

150,[5] BUUCTF WEB [BJDCTF2020]EasySearch

进入靶场 有个文件 和之前一道题如出一辙 <?php// 开启输出缓冲&#xff0c;将后续所有的输出内容先暂存到缓冲区&#xff0c;而不是直接发送到浏览器ob_start();/*** 生成一个基于随机字符串和唯一标识符的哈希值* return string 返回生成的 sha1 哈希值*/function get_…

分布式光纤传感:为生活编织“感知密网”

分布式光纤测温技术虽以工业场景为核心&#xff0c;但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术&#xff08;DTS&#xff09;作为一种先进的线型温度监测手段&#xff0c;近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…

腾讯发布混元-3D 2.0: 首个开源高质3D-DiT生成大模型

在之前的文章中已经和大家介绍过腾讯HunYuan-3D 1.0&#xff0c;感兴趣的小伙伴可以点击下面链接阅读~ HunYuan-3D 是首个开源高质3D-DiT生成大模型&#xff0c;几何与纹理解藕生成&#xff0c;一键将创意具象化。 2.0模型架构图及介绍 2.0模型将几何和纹理生成解耦&#xff0…

CentOS搭建PPPOE服务器

一、安装软件包 yum -y install rp-pppoe 二、配置服务器 1.修改配置文件 打开/etc/ppp/pppoe-server-options文件 nano /etc/ppp/pppoe-server-options 编辑为以下内容&#xff1a; # PPP options for the PPPoE server # LIC: GPL require-pap require-chap login …

数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除

头文件&#xff1a;head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…

IDEA集成DeepSeek

引言 随着数据量的爆炸式增长&#xff0c;传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术&#xff0c;凭借其强大的语义理解与深度学习能力&#xff0c;正在改变搜索领域的游戏规则。 对于 Java 开发者而言&#xff0c;将 DeepSeek 集成…