Linux:基础IO

文章目录

    • 一、理解"文件"
        • 1、狭义上的理解
        • 2、广义上的理解
        • 3、文件操作的认知
        • 4、系统角度
    • 二、C语言文件接口
        • 1、ls /proc/[进程id] -l 命令查看当前正在运⾏进程的信息
        • 2、stdin 和 stdout 和 stderr
    • 三、系统文件 I/O
        • 1、标志位传递的一种方法
        • 2、系统调用 open
    • 三、文件描述符fd
        • 1、write 写文件
        • 2、read 读文件
        • 3、0、1、2 文件描述符
        • 4、重定向
    • 四、理解“一切皆文件”
    • 五、缓冲区
        • 1、什么是缓冲区
        • 2、为什么要引入缓冲区机制
        • 3、缓冲类型
        • 4、fsync 将内核缓冲区刷新到外设
        • 5、简单设计libc库

一、理解"文件"

1、狭义上的理解

• ⽂件在磁盘⾥
• 磁盘是永久性存储介质,因此⽂件在磁盘上的存储是永久性的
• 磁盘是外设(即是输出设备也是输⼊设备)
• 磁盘上的⽂件 本质是对⽂件的所有操作,都是对外设的输⼊和输出 简称 IO

2、广义上的理解

• Linux 下⼀切皆⽂件(键盘、显⽰器、⽹卡、磁盘…… 这些都是抽象化的过程)

3、文件操作的认知

• 对于 0KB 的空⽂件是占⽤磁盘空间的
• ⽂件是⽂件属性(元数据)和⽂件内容的集合(⽂件 = 属性(元数据)+ 内容)
• 所有的⽂件操作本质是⽂件内容操作和⽂件属性操作

4、系统角度

• 对⽂件的操作本质是进程对⽂件的操作
• 磁盘的管理者是操作系统• ⽂件的读写本质不是通过C语⾔/C++的库函数来操作的(这些库函数只是为⽤⼾提供⽅便),⽽是通过⽂件相关的系统调⽤接来实现的

fopen,fclose…库封装了底层OS的文件系统调用!

二、C语言文件接口

1、ls /proc/[进程id] -l 命令查看当前正在运⾏进程的信息

在这里插入图片描述
其中:

  • cwd:指向当前进程运⾏⽬录的⼀个符号链接。
  • exe:指向启动当前进程的可执⾏⽂件(完整路径)的符号链接。
2、stdin 和 stdout 和 stderr
  • C默认会打开三个输⼊输出流,分别是stdin, stdout, stderr

在这里插入图片描述
stdin:标准输入 键盘文件
stdout:标准输出 显示器文件
stderr:标准错误 显示器文件

三、系统文件 I/O

1、标志位传递的一种方法

标志位传递的一种方法:
在这里插入图片描述

2、系统调用 open

在这里插入图片描述
第一个参数带路径,或只写文件名就在当前路径打开文件
flags的选项:表示打开文件的模式,每一个模式都是一个标记位

在这里插入图片描述

都是宏替换,每个标志位只有一个比特位为1

mode:权限位,在新建文件时

在这里插入图片描述
这里传的mod 参数最终的权限会受到umask的影响

可以通过umask()函数设置当前程序的权限掩码
在这里插入图片描述
在这里插入图片描述

close()把打开的文件关闭
在这里插入图片描述
在这里插入图片描述

三、文件描述符fd

1、write 写文件

在这里插入图片描述
const void *buf 可以二进制写入和文本写入

第一个参数fd就是open()的返回值,这个返回值叫文件描述符
在这里插入图片描述

2、read 读文件

在这里插入图片描述

3、0、1、2 文件描述符

Linux进程默认情况下会有3个缺省打开的⽂件描述符,分别是标准输⼊0,标准输出1,标准错误2.
在这里插入图片描述
在这里插入图片描述
是C语言提供了一个结构体 typedef XXX{…}FILE; 中一定封装了文件描述符fd!!!
在这里插入图片描述

4、重定向

更改文件描述符表的指针指向,数组下标不变

李淼换太子实现重定向:
在这里插入图片描述
原本标准输出的文件描述符是1,但关闭1后重新把1分配给fd,而printf()打印是标准输出1这个文件里面的,此时输出在log.txt文件中,这种现象就是重定向

  • 系统调用进行重定向

在这里插入图片描述

int dup2(int oldfd, int newfd);

使newfd成为oldfd的一份拷贝
在这里插入图片描述

  • 重定向:打开文件的方式+dup2

四、理解“一切皆文件”

通过封装一层驱动软件使得文件指针指向不同的操作实现多态来屏蔽底层设备的差异
在这里插入图片描述

五、缓冲区

1、什么是缓冲区

缓冲区是内存空间的⼀部分。也就是说,在内存空间中预留了⼀定的存储空间,这些存储空间⽤来缓冲输⼊或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输⼊设备还是输出设备,分为输⼊缓冲区和输出缓冲区。

2、为什么要引入缓冲区机制

在这里插入图片描述

提高使用者的效率

3、缓冲类型

在这里插入图片描述

在这里插入图片描述
显示器文件写入时:行刷新

在这里插入图片描述
普通文件:全缓存,写满时刷新
在这里插入图片描述

4、fsync 将内核缓冲区刷新到外设

在这里插入图片描述

5、简单设计libc库

my_stdio.h :

#pragma once#include <stdio.h>#define FLUSH_NONE 0
#define FLUSH_LINE 1
#define FLUSH_FULL 2#define SIZE 1024struct IO_FILE 
{int fileno;//文件描述符int flag;//打开文件方式char buffer[SIZE]; //模拟缓冲区int size;//文件大小int flush_mode;//刷新方式
};typedef struct IO_FILE mFILE;mFILE* Myfopen(const char* path,const char* mod);void Myfclose(mFILE* f);void Myfflush(mFILE* f);void Myfwrite(const char* str,int len,mFILE* f);

my_stdio.c

#include "my_stdio.h"
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>mFILE* Myfopen(const char* path,const char* mod)
{int fd = -1;int flag;if(strcmp(mod,"r") == 0){flag = O_RDONLY;fd = open(path,flag);}else if(strcmp(mod,"w") == 0){flag = O_CREAT | O_WRONLY | O_TRUNC;fd = open(path,flag,0666);}else if(strcmp(mod,"a") == 0){flag = O_CREAT | O_WRONLY | O_APPEND; fd = open(path,flag,0666);} else {//...}if(fd < 0)return NULL;mFILE* pf = (mFILE*)malloc(sizeof(mFILE));if(pf == NULL){close(fd);return NULL;}pf->fileno = fd;pf->flag = flag;pf->flush_mode = FLUSH_LINE;pf->size = 0;return pf;
}void Myfflush(mFILE* f)
{write(f->fileno,f->buffer,f->size);f->size = 0;fsync(f->fileno);
}void Myfwrite(const char* str,int len,mFILE* f)
{int j = 0;while(j < len){int i = f->size;for(;i < SIZE &&  j  < len; i++,j++){f->buffer[i] = str[j];}f->size = i;if(i == SIZE){Myfflush(f);}}if(f->flush_mode == FLUSH_LINE && f->buffer[f->size - 1] == '\n'){Myfflush(f);}
}void Myfclose(mFILE* f)
{if(f->size > 0)Myfflush(f);close(f->fileno);free(f);
}

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

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

相关文章

zabbix数据采集以及自定义监控

目录 1.数据采集 2.自定义监控 2.1客户端 2.2服务端 ​​​​​​​1.数据采集 点击最新数据页面如下图 往下滑查看具体数据 并点击查看图像就可以看到图像了 就可以看到如下图内容 2.自定义监控 我们通过zabbix客户端任何模板就可以监控我们想要的任何资源 如果…

02.25 继承和多态

编写一个如下场景&#xff1a; 有一个英雄Hero类&#xff0c;私有成员&#xff0c;攻击&#xff0c;防御&#xff0c;速度&#xff0c;生命值&#xff0c;以及所有的set get 方法 编写一个 武器 Weapon 类&#xff0c;拥有私有成员攻击力&#xff0c;以及set get 方法 编写一个…

6. grafana的graph简介

1. Settings功能 2. Visualization功能 &#xff08;可视化的方式&#xff0c;后续会写一些&#xff09; 3. Display 功能&#xff08;显示方面的设置&#xff09; bars 柱状图方式显示 lines&#xff08;不选不会出功能&#xff09; line width 线条的粗细 staircase 会让折…

前缀和代码解析

前缀和是指数组一定范围的数的总和,常见的有两种,一维和二维,我会用两道题来分别解析 一维 DP34 【模板】前缀和 题目: 题目解析: 暴力解法 直接遍历数组,遍历到下标为 l 时,开始进行相加,直到遍历到下标为 r ,最后返回总和.这样做的时间复杂度为: O(n) public class Main …

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理&#xff08;NLP&#xff09;任务上取得了最新的最优结果&#xff08;SOTA&#xff09;。然而&#xff0c;这些模型容易受到对抗攻击的影响&#xff0c;尤其是对于表意文字语言&#xff08;如中文&#xff09;。 在本研究中&#xff0…

【原创工具】文件清单生成器 By怜渠客

【原创工具】文件清单生成器 By怜渠客 刚在论坛看到了一个文件列表生成器 文件列表生成器 - 吾爱破解 - 52pojie.cn &#xff0c;和我去年写的一个软件很像&#xff0c;当时我也是有需求&#xff0c;要把一个文件夹里及其子文件夹里所有的文件列出来&#xff0c;就临时弄了个小…

深度学习-6.用于计算机视觉的深度学习

Deep Learning - Lecture 6 Deep Learning for Computer Vision 简介深度学习在计算机视觉领域的发展时间线 语义分割语义分割系统的类型上采样层语义分割的 SegNet 架构软件中的SegNet 架构数据标注 目标检测与识别目标检测与识别问题两阶段和一阶段目标检测与识别两阶段检测器…

【Linux】初始操作系统和进程(一)

目录 前言&#xff1a; 一、冯诺依曼体系结构&#xff1a; 二、操作系统&#xff1a; 1.操作系统是什么&#xff1f; 2.为什么要有操作系统&#xff1f; 3.操作系统是如何管理下层的&#xff1f; 4.操作系统是如何对上层提供服务的&#xff1f; 三、进程&#xff1a; …

【链 表】

【链表】 一级目录1. 基本概念2. 算法分析2.1 时间复杂度2.2 空间复杂度2.3 时空复杂度互换 线性表的概念线性表的举例顺序表的基本概念顺序表的基本操作1. 初始化2. 插入操作3. 删除操作4. 查找操作5. 遍历操作 顺序表的优缺点总结优点缺点 树形结构图形结构单链表基本概念链表…

python-leetcode-字符串解码

394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; class Solution:def decodeString(self, s: str) -> str:stack []num 0curr_str ""for char in s:if char.isdigit():num num * 10 int(char)elif char [:stack.append((curr_str, num))curr_str, …

力扣 下一个排列

交换位置&#xff0c;双指针&#xff0c;排序。 题目 下一个排列即在组成的排列中的下一个大的数&#xff0c;然后当这个排列为降序时即这个排列最大&#xff0c;因为大的数在前面&#xff0c;降序排列的下一个数即升序。所以&#xff0c;要是想找到当前排列的下一个排列&…

ProGuard加密混淆SpringBoot应用代码

背景 我们的项目是基于SpringCloud架构的微服务应用&#xff0c;采用Docker离线部署方式交付客户&#xff0c;通过授权证书来控制应用的许可功能模块和使用时间。我们已经在代码层已经实现&#xff1a; 基于多维度硬件指纹的绑定验证&#xff0c;cpu id、mac地址、磁盘序列、…

动态链接器(九):.init和.init_array

ELF文件中的.init和.init_array段是程序初始化阶段的重要组成部分&#xff0c;用于在main函数执行前完成必要的初始化操作。 1 .init段和.init_array 段 1.1 作用 .init段包含编译器生成的初始化代码&#xff0c;通常由运行时环境&#xff08;如C标准库的启动例程&#xff0…

Ollama微调

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。在上一篇文章中我们部署Ollama&#xff0c;并使用简单命令管理Ollama。接下来我们学习Ollama的高级应用。通过Ollama的Mod…

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址&#xff1a;GitHub - deepseek-ai/FlashMLA 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天&#xff01; ​ 一、开源周震撼启幕 继上周预告后&#xff0c;DeepSeek于北京时间今晨9点准时开源「FlashMLA」&#xff0c;打响开源周五连…

(七)懒加载预加载

&#xff08;一&#xff09;懒加载 1. 什么是懒加载 懒加载&#xff0c;即延迟加载。在访问页面时&#xff0c;先将 img 元素或其他元素的背景图片路径替换为占位图&#xff08;通常是 1*1px 的小图片&#xff09;&#xff0c;仅当元素进入浏览器可视区域时&#xff0c;才设置…

Revisiting Reverse Distillation for Anomaly Detection

重新审视反向蒸馏在异常检测中的应用 文章链接&#xff1a;点这里 源码链接&#xff1a;点这里 前言 此篇文章是在 Anomaly detection via reverse distillation from one-class embedding 这篇的基础上改进创新的。重新审视了反向蒸馏&#xff08;KD&#xff09;这一想法&am…

Windows CMD 命令大全(Complete List of Windows CMD Commands)

Windows CMD 命令大全&#xff1a; Windows CMD 是 Windows 系统内置的命令行工具&#xff0c;用于执行各种命令和管理任务。 称为Command Prompt。它提供了一个通过键入命令来与计算机系统进行交互的方式&#xff0c;类似于早期的DOS操作系统。以下是 CMD 的基础知识和常用命…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

【JavaWeb13】了解ES6的核心特性,对于提高JavaScript编程效率有哪些潜在影响?

文章目录 &#x1f30d;一. ES6 新特性❄️1. ES6 基本介绍❄️2. 基本使用2.1 let 声明变量2.2 const 声明常量/只读变量2.3 解构赋值2.4 模板字符串2.5 对象拓展运算符2.6 箭头函数 &#x1f30d;二. Promise❄️1. 基本使用❄️2. 如何解决回调地狱问题2.1回调地狱问题2.2 使…