【Linux 基础 IO】文件系统,对系统调用函数的讲解

文章目录

      • 1.初步理解文件
      • 2.C语言环境下的文件操作
        • 2.1 C库中 fopen、fwrite 的讲解
        • 2.2 C文件操作的实例
      • 3.系统调用接口的讲解
        • 3.1 系统调用函数的讲解
          • 3.1.1 open ( ) 函数的讲解
          • 3.1.2 write ( ) 函数的讲解
          • 3.1.3 lseek ( ) 函数的讲解
          • 3.1.2 read ( ) 函数的讲解
        • 3.2 用系统调用读写文件

1.初步理解文件

🐧① 打开文件: 本质是进程打开文件,只有程序运行起来文件才被打开;

🐧②文件没有被打开的时候在哪里呢? ----- 在磁盘中

🐧③进程可以打开很多个文件吗? ---- 可以的🙆‍

🐧④系统中可不可以存在很多个进程呢? ---- 可以存在

🐧⑤由第3、4点可以得知,在OS内部一定存在大量的被打开的文件(如何管理呢? 先描述,在组织


2.C语言环境下的文件操作

2.1 C库中 fopen、fwrite 的讲解

🐧①语法:
在这里插入图片描述


🐧②fopen () 的打开方式:

Ⅰ.✌ 以w 的方式打开: 如果该路径下没有该文件的话,则创建该文件,如果该文件存在的话,则在打开文件的时候,把文件的内容清空;

Ⅱ.✌a的方式打开: 直接在该文件的后面追加内容,不会清空文件;

  • 以下两个知识点是 Linux 中的概念:

Ⅲ.✌输出重定向>,实际上就是充当 w的作用;
在这里插入图片描述

Ⅳ.✌追加重定向>>,它实际充当的是 a的作用;
在这里插入图片描述



🐧② fprintf ( ) 的使用

在这里插入图片描述

将内容打印到 log.txt 这个文件中:
在这里插入图片描述


2.2 C文件操作的实例
  • 三点要求如下所示: 🔍

🐧Ⅰ. 对fopen, fread, fwrite, fseek, fclose等函数的使用;

🐧Ⅱ.使用代码打开当前路径下的“bite”文件(如果文件不存在在创建文件),向文件当中写入“linux so easy!”.

🐧Ⅲ.在从文件当中读出文件当中的内容, 打印到标准输出当中; 关闭文件流指针;

  • 代码实现如下:
    🐧代码涉及的知识点如下
    🍎Ⅰ. fopen () 函数的打开方式:
    在这里插入图片描述

🍎Ⅱ. fseek( ) 函数的讲解
大家说说 fseek( ) 函数有什么大的用处呢?

我们在向一个文件写入数据的时候,当我们写完以后,文件的读写位置就停在了写完之后的位置,当我们再对该文件进行读取的时候,读入的都是该文件有效内容之后的数据,导致我们无法读到我们想要的内容,而 fseek( ) 函数就可以把文件的读写位置移动到文件的开头,我们就可以读到想要的内容啦! 😃

int fseek(FILE *stream, long offset, int whence);    

offset (偏移量) : 以字节为单位;

whence(何处) :用于定义参数 offset 偏移量对应的参考值(可以理解为文件读写位置的初始值),该参数为下列其中一种(宏定义):
SEEK_SET :读写偏移量将指向 offset 字节位置处(从文件头部开始算);

SEEK_CUR :读写偏移量将指向当前位置偏移量 + offset 字节位置处, offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;

SEEK_END :读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负, 如果是正数表示往后偏移、如果是负数则表示往前偏移。



🍎Ⅲ.fread ( ) 函数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

在这里插入图片描述


🍎Ⅲ.fwrite ( ) 函数

在这里插入图片描述

#include <stdio.h>
#include <string.h>int main()
{FILE *fp = fopen("./bite", "wb+");if (fp == NULL) {perror("fopen error");return -1; }   // 0 表示指针指向文件的开始进行读写fseek(fp, 0, SEEK_SET);char *data = "linux so easy!\n";size_t ret = fwrite(data, 1, strlen(data), fp);if (ret != strlen(data)) {perror("fwrite error");return -1; }   fseek(fp, 0, SEEK_SET);//跳转读写位置到,从文件起始位置开始偏移0个字节char buf[1024] = {0};//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ret = fread(buf, 1, 1023, fp);//因为设置读取块大小位1,块个数为1023因此fread返回值为实际读取到的数据长度if (ret == 0) {if (ferror(fp)) //判断上一次IO操作是否正确printf("fread error\n");if (feof(fp)) //判断是否读取到了文件末尾printf("read end of file!\n");return -1; }   printf("%s", buf);fclose(fp);return 0;
}

3.系统调用接口的讲解

  • 为什么要有系统调用呢?
    🐧Ⅰ.我们对文件进行读写操作,文件是存储在磁盘中的,而磁盘是硬件,所以向文件写入本质是向硬件写入,我们作为一个用户,操作系统绝对不允许我们对硬件直接进行访问,所以操作系统为我们提供系统调用以便我们能够访问文件。

3.1 系统调用函数的讲解
3.1.1 open ( ) 函数的讲解

🐧① 语法:
在这里插入图片描述
🐧② 参数 flags 的详解

flags 表示以什么样的方式打开文件, O_RDONLY(只读), O_WRONLY(只写), or O_RDWR(读写)O_APPEND(追加方式打开)O_TRUNC(清空文件,重新写入)O_CREAT(该文件不存在就创建该文件)

具体怎么使用呢? ----- 涉及到一个位图的概念,这些 O_RDONLY(只读)已经被宏定义成为了一个值,这个值代表在二进制下某一位数字为1,然后用 |(与)操作就可以把几种方式联系到一起了;

🐧③ 参数 mode 的介绍

参数 mode 指定创建新文件时的文件权限。当参数 flags 指定标志位 O_CREAT O_TMPFILE 的时候,必须指定参数 mode,其他情况下忽略参数 mode。


3.1.2 write ( ) 函数的讲解

写入失败则返回 -1

在这里插入图片描述


3.1.3 lseek ( ) 函数的讲解

🍎Ⅰ.为什么要用 lseek ( ) 函数呢? 因为我们在使用 write ( ) 函数之后,文件的读写位置就停在了写完之后\0位置,我们再次对文件进行读取的时候就什么也读不到了,所以需要用 lseek ( ) 函数来移动文件的读写位置;

在这里插入图片描述


3.1.2 read ( ) 函数的讲解

在这里插入图片描述

3.2 用系统调用读写文件
  • 要求如下三点:
    🐧Ⅰ.对 open, read, write, lseek, close等函数的使用:

    🐧Ⅱ.使用代码打开当前路径下的“bite”文件(如果文件不存在在创建文件),向文件当中写入“i like linux!”。

    🐧Ⅲ.在从文件当中读出文件当中的内容, 打印到标准输出当中; 关闭文件描述符
#include <stdio.h>
#include <unistd.h>//是close, write这些接口的头文件
#include <string.h>
#include <fcntl.h>//是 O_CREAT 这些宏的头文件
#include <sys/stat.h>//umask接口头文件int main()
{//将当前进程的默认文件创建权限掩码设置为0--- 并不影响系统的掩码,仅在当前进程内生效umask(0);//int open(const char *pathname, int flags, mode_t mode);int fd = open("./bite", O_CREAT|O_RDWR, 0664);if(fd < 0) {perror("open error");return -1; }   char *data = "i like linux!\n";//ssize_t write(int fd, const void *buf, size_t count);ssize_t ret = write(fd, data, strlen(data));if (ret < 0) {perror("write error");return -1; }   //off_t lseek(int fd, off_t offset, int whence);lseek(fd, 0, SEEK_SET);char buf[1024] = {0};//ssize_t read(int fd, void *buf, size_t count);ret = read(fd, buf, 1023);if (ret < 0) {perror("read error");return -1; }else if (ret == 0) {printf("end of file!\n");return -1; }   printf("%s", buf);close(fd);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LLAMA3中文语料 fine tune 测试与比对

概述&#xff1a; Meta开发并发布了Meta-Lama 3大语言模型家族&#xff08;LLM&#xff09;&#xff0c;Llama 3指令调优模型针对对话用例进行了优化&#xff0c;在常见的行业基准上优于许多可用的开源聊天模型。本文尝试对LLAMA3 在中文语料中尝试进行fine tune 为后续对 通义…

一文掌握gRPC

文章目录 1. gRPC简介2. Http2.0协议3. 序列化-Protobuf4. gRPC开发实战环境搭建5. gRPC的四种通信方式&#xff08;重点&#xff09;6. gRPC的代理方式7. SprintBoot整合gRPC 1. gRPC简介 gRPC是由google开源的高性能的RPC框架。它是由google的Stubby这样一个内部的RPC框架演…

小米手机删除照片视频后没有释放手机存储空间

问题描述&#xff1a;小米手机11青春版&#xff0c;删除照片视频后&#xff0c;手机的存储空间没有变化&#xff1b; 问题原因&#xff1a;因为并没有真正的删除&#xff1b; 解决方案&#xff1a;手机 > 设置 > 我的设备 > 存储空间 > 应用公共文件(在最底部) &…

IT服务台的演变趋势

在技术进步和用户期望变化的推动下&#xff0c;IT服务台正在经历重大变化。IT服务台的未来将主要受到以下趋势的推动&#xff1a; 先进的人工智能和认知技术 预计高级人工智能 &#xff08;AI&#xff09; 和认知技术在 IT 服务台中的集成度会更高。通过将 IT 服务台集成到 IT…

上云后,如何保障数据安全?

云计算可以在线保存大量数据&#xff0c;并可以在任何时间、任何设备上使用。灵活性、可扩展行以及性价比等诸多buff加持&#xff0c;使许多企业用它来管理庞大的数据。 云计算安全 云计算通过为数据处理、存储和访问提供方便和灵活的解决方案&#xff0c;彻底改变了组织的运…

使用ffmpeg将本地摄像头推流至RTSP服务器,支持RTSP和RTMP协议

一、流媒体传输协议&#xff1a;RTSP和RTMP 1、RTSP和RTMP的工作原理 1.1&#xff09;RTSP工作原理 用户设备向视频流平台发送RTSP请求。视频流平台返回可操作的请求列表&#xff0c;如播放、暂停等。用户设备发送具体的请求&#xff0c;如播放。视频流平台解析请求并启动相…

IO的阻塞和非阻塞浅析

在操作系统和网络编程中&#xff0c;IO&#xff08;输入/输出&#xff09;操作是一个非常重要的概念。 在处理IO的时候&#xff0c;阻塞和非阻塞都是同步IO。只有使用了特殊的API才是异步IO。 ——陈硕大神 网络IO层面 典型的一次IO的两个阶段是什么&#xff1f; 数据准备 和…

【强训笔记】day21

NO.1 思路&#xff1a;第一个位置放最小的&#xff0c;其次放最大的&#xff0c;依次类推。 代码实现&#xff1a; #include<iostream>using namespace std; int n;int main() {cin>>n;int left1,rightn;while(left<right){cout<<left<<" &…

图片批量处理与格式转换:JPG转TIFF,轻松应对大量图片

在数字化时代&#xff0c;图片已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当面对大量的图片文件时&#xff0c;如何高效地进行处理和格式转换&#xff0c;成为了许多人面临的挑战。幸运的是&#xff0c;借助现代的办公提效工具和技术&#xff0c;我们可以轻松…

vue2 报错 component name“Index“should always be multi-word

报错原因&#xff1a; 组件名称应该为俩个或俩个以上单词组成的&#xff0c;并且还要是大驼峰命名&#xff0c;例如&#xff1a;MyIndex&#xff0c;MyLogin等 解决方法一&#xff1a; 将组件名称改为俩个或俩个以上单词组成的名称&#xff0c;且为大驼峰命名&#xff0c;例如…

怎么用电脑接收手机文件 用备忘录传输更舒服

在这个数字化时代&#xff0c;手机已经成为我们随身携带的“百宝箱”&#xff0c;里面装满了各种重要的文件、资料和信息。然而&#xff0c;有时我们需要在电脑上处理这些文件&#xff0c;比如编辑文档、制作PPT或是查看照片。那么&#xff0c;如何在电脑与手机之间实现文件的顺…

计算机发展史故事【11】

爆发超新星 IBM 号称巨人&#xff0c;竟在巨型机领域败在小小的控制数据公司CDC 手下。在小型机领域&#xff0c;“霸主”DEC 公司的“后院”也曾“起火”&#xff0c;绝非一直风平浪静。 本世纪60 年代末&#xff0c;DEC 公司因开发小型电脑迅速崛起&#xff0c;赢得“小型机…

AI日报|OpenAI发布模型规范指南Model Spec,通义千问2.5发布,号称性能赶超GPT-4...

OpenAI发布“Model Spec”计划&#xff0c;旨在为人工智能行为设定指导原则 阿里云通义千问2.5正式发布&#xff0c;号称性能全面赶超GPT-4 Google DeepMind推出下一代蛋白质预测模型AlphaFold 3&#xff0c;预测所有生命分子结构和相互作用 Microsoft宣布在威斯康星州投资3…

栈的实现与OJ括号匹配

今日备忘录: "不破不立. " 本文索引 1. 前言2. 顺序表与链表的区别3. 什么是栈4. 栈的实现5. OJ括号匹配6. 总结 1. 前言 人总是在坍塌中重建, 有些东西必须摧毁, 才能迎来新生, 不管是那些消耗你的人, 还是令你感到焦虑的事情, 还是一份你觉得毫无意义并且又不喜欢…

python词云图形状修改

python词云图形状修改 词云图介绍wordcloud介绍修改形状参数效果代码 词云图介绍 词云图&#xff08;Word Cloud&#xff09;是一种文本数据的可视化表示形式&#xff0c;它通过字体大小、颜色、布局等视觉元素来展示文本中不同词汇的频率或重要性。词云图中&#xff0c;出现频…

南京中科微Ci24R1(DFN8)无线收发射频芯片性能介绍

Ci24R1是南京中科微研发的低成本高性能2.4GHz GFSK 无线收发芯片&#xff08;支持蓝牙版&#xff09;&#xff0c;专为低功耗无限场合设计&#xff0c;集成嵌入式ARQ基带协议引擎的无线收发器芯片。 工作频率为2400MHz-2525MHz&#xff0c;共有126个1MHz带宽的信道&#xff0c…

.NET 复现某多媒体中间件文件上传漏洞

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

如何挑选“好用”的工业APP

我们日常生活中每天都在使用各种生活类的APP,然而&#xff0c;当我们谈到工业APP时&#xff0c;很多人可能并不那么熟悉。工业APP&#xff0c;虽然不像生活类APP那样直接面向广大消费者&#xff0c;但在工业领域却扮演着至关重要的角色。 先简单认识下啥是工业APP? 工业APP是…

“交个朋友”申请注册商标都已被驳回!

“ 交个朋友”在直播带货界非常有名&#xff0c;普推知产老杨在商标局官网上检索发现&#xff0c;“交个朋友”主体申请了以“交个朋友”四百多个相关商标&#xff0c;基本上都被驳回&#xff0c;其实这样的名称不应提报商标&#xff0c;专业商标人员一看就过不了&#xff0c;还…

水经微图万能版、专业版与企业版的区别?

水经微图&#xff08;以下简称“微图”&#xff09;的版本&#xff0c;主要分为万能版、专业版和企业版三个版本。 什么是万能版&#xff1f; 万能版是指“水经注万能地图下载器”软件功能的授权&#xff0c;虽然该软件已经停止更新&#xff0c;但购买过该软件的用户&#xf…