Linux系统IO—探索输入输出操作的奥秘

                                                           🎬慕斯主页修仙—别有洞天 

                                                         ♈️今日夜电波:HEART BEAT—YOASOBI

                                                                2:20━━━━━━️💟──────── 5:35
                                                                    🔄   ◀️   ⏸   ▶️    ☰  

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

什么是Linux系统IO?

open()

close()

write()

read()

lseek()


什么是Linux系统IO?

        Linux系统IO,指的是在Linux操作系统中进行的所有输入输出操作。这些操作可以通过不同的方式实现,包括系统I/O和标准I/O。

        具体来说,系统I/O是Linux系统内核提供的API,主要用于处理底层的输入输出任务例如,传统的访问方式是通过write()和read()两个系统调用实现的,通过read()函数读取文件到缓存区中,然后通过write()方法把缓存中的数据输出到网络端口。

        另一方面,标准I/O是C语言在Linux操作系统下的API,主要用于处理应用程序的输入输出任务。它提供了一套丰富的库函数和系统调用,方便开发者进行文件读写操作。

        以下是一些常用的系统IO:

  1. 打开文件:open()、creat()
  2. 关闭文件:close()
  3. 读取文件:read()
  4. 写入文件:write()
  5. 移动文件指针:lseek()
  6. 删除文件或目录:unlink()、rmdir()
  7. 创建目录:mkdir()
  8. 删除目录:rmdir()、rm()
  9. 重命名文件或目录:rename()
  10. 获取文件状态:stat()、fstat()
  11. 更改文件权限和时间戳:chmod()、chown()、utime()

        本文主要介绍最常用的open()、close()、read()、write()、lseek()。

open()

        Linux中的open()函数用于打开或创建一个文件,并返回一个文件描述符。它的定义如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.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(读写)等。需要注意的是:flags是可以选择多种权限的,比如:O_RDWR | O_CREAT | O_APPEND(以读写的方式打开,以追加的方式打开文件,并且如果该文件不存在则创建该文件)。
  3. mode:当指定了O_CREAT标志时,表示需要使用文件的权限模式,如S_IRUSR(用户读)、S_IWUSR(用户写)等。比如上面我们设置了O_CREAT,那么在就必须设置mode,此时我们要设置对应的权限:比如:0666(设置为所有人可读写),但是需要注意的是默认 umask=0002,因此我们需要在文件open()前设置umask(0)。一个例子:

        🌰 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
	umask(0);
    int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_APPEND, 0666);
    close(fd);
    return 0;
}

        返回值:

        成功时,返回一个非负整数,表示文件描述符;失败时,返回-1,并设置errno。

        详细的操作:

close()

        在Linux系统中,close()函数的主要功能是关闭一个已打开的文件描述符,以释放相应的系统资源。具体来说,close()函数会释放与该进程关联并由该进程拥有的文件上保留的所有记录锁,并使文件描述符不再引用任何文件,从而允许系统重用该文件描述符。

        详细的操作:

write()

        在Linux系统中,write()函数用于向文件中写入数据。其函数原型为:

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

        其中,参数fd是文件描述符,表示要写入的文件;buf是一个指向要写入数据的缓冲区的指针;count是要写入的字节数。

        当调用成功时,write()函数返回实际写入的字节数。如果返回的值与count相等,说明所有数据均已成功写入文件。如果返回的值小于count,则说明发生了错误或某些数据未能写入。

        当发生错误时,write()函数会设置全局变量errno来指示具体的错误类型。例如:

  • EACCES:访问被拒绝(通常是由于权限不足)。
  • EPIPE:向一个已经关闭的管道或套接字发送数据。
  • EAGAIN或EWOULDBLOCK:文件已被其他进程锁定或者当前没有可用的数据空间。
  • EBADF:文件描述符无效。
  • EINTR:系统中断,比如信号等导致了write()函数被提前终止。
  • EIO:输入/输出错误,通常由硬件问题引起。
  • ENOSPC:磁盘已满或者设备上没有足够的空间来存储数据。

        需要注意的是,write()函数并不会将数据立即写入磁盘,而是将其缓存在内核中,等到满足一定的条件后才会真正写入磁盘。因此,如果想要确保数据被立即写入磁盘,可以使用fsync()函数或fdatasync()函数对文件进行同步操作。

        🌰

   #include<stdio.h>
   #include<sys/types.h>
   #include<unistd.h>
   #include<sys/stat.h>                                    
   #include<fcntl.h>                    
   #include<string.h>
   #define FILE_NAME "1.txt"                                  
   int main()                           
   {                    
    umask(0);                             
    int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_APPEND, 0666);
    char buf[1024]={0};
    fgets(buf,sizeof(buf),stdin);                                    
    int wd=write(fd,&buf,strlen(buf)-1);//strlen(buf)-1是为了去掉\n直接在后面接                                           
    printf("成功写入%d个数据\n",wd);                          
    close(fd);                          
    return 0;                                         
  }      

        详细的操作:

read()

        在Linux中,read()函数用于从文件描述符中读取数据。它通常与open()函数一起使用,以打开一个文件并获取文件描述符。

        read()函数的原型如下:

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

        其中,fd是文件描述符,buf是一个指向缓冲区的指针,count是要读取的字节数。

        read()函数返回实际读取的字节数,如果返回值小于请求的字节数,则表示已到达文件末尾或发生了错误如果返回值为-1,则表示发生了错误。

        🌰

   #include<stdio.h>
   #include<sys/types.h>
   #include<unistd.h>
   #include<sys/stat.h>                                    
   #include<fcntl.h>                    
   #include<string.h>
   #define FILE_NAME "1.txt"  
	int main()
  	{
  	  int fd=open(FILE_NAME,O_RDONLY);
  	  char buf[1024]={0};
  	  int rd=read(fd,buf,sizeof(buf));
  	  printf("读取:%d数据\n",rd);
   	  printf("%s\n",buf);                                                          
   	  close(fd);
      return 0;
  	}

        详细的操作:

lseek()

        在Linux操作系统中,lseek()函数是一个关键的工具,用于改变文件的当前读写位置。这个函数主要应用在对文件进行随机访问的时候。

        其函数原型为:

#include <sys/types.h>
#include <unistd.h>
off_t lseek (int fd, off_t offset, int whence);

        其中,参数fd表示需要进行操作的文件描述符;offset表示偏移量,这是要移动的字节数,可正可负;whence则代表偏移起始位置,有以下三种选择:

  • SEEK_SET: 从文件头部开始偏移offset个字节。
  • SEEK_CUR: 从文件当前读写的指针位置开始,增加offset个字节的偏移量。
  • SEEK_END: 文件偏移量设置为文件的大小加上偏移量字节。

        值得注意的是,lseek()函数成功执行后会返回新的文件偏移量,如果操作失败则返回-1。通过这个函数,我们可以实现对文件的任意位置的读写操作,而不再局限于顺序读取或者写入数据。这对于管理大文件尤其有用,因为它允许我们直接跳转到所需的特定部分,而不是从头到尾按顺序处理文件内容。

        🌰

   #include<stdio.h>
   #include<sys/types.h>
   #include<unistd.h>
   #include<sys/stat.h>                                    
   #include<fcntl.h>                    
   #include<string.h>
   #define FILE_NAME "1.txt"  
	int main()
  	{
  	  int fd=open(FILE_NAME,O_RDONLY);
  	  char buf[1024]={0};
      for(int i=0;i<3;i++)//打印三次文件
      {
        lseek(fd,0,SEEK_SET);//注意前下图中前部分注释掉该段,后半没注释    
  	  	int rd=read(fd,buf,sizeof(buf));
  	  	printf("读取:%d数据\n",rd);
   	  	printf("%s\n",buf); 
        *buf='\0';//清空缓冲区操作
      }
   	  close(fd);
      return 0;
  	}

        详细的操作:


                        感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PMP过了就是中级职称?

&#x1f33b;PMP项目管理专业人士认证在全球范围内受到广泛认可&#xff0c;许多人就误以为获得PMP证书就等同于获得中级职称。但是&#xff0c;事实真的如此吗❓ 1️⃣PMP不属于职称认证 ✅PMP证书&#xff1a; 是由美国项目管理协会(PMI)颁发的专业认证&#xff0c;旨在证明…

2022年多元统计分析期末试题

2023年多元统计分析期末试题 1.试论述系统聚类、动态聚类和有序聚类的异同之处。 2、设 X {X} X~ N 3 {N_3} N3​(μ&#xff0c;Σ)&#xff0c;其中 X {X} X ~ ( X 1 {X_1} X1​, X 2 {X_2} X2​, X 3 {X_3} X3​)&#xff0c;μ (1,-2,3)‘&#xff0c;Σ [ 1 1 1 1 3 2…

leetcode——杨辉三角

https://leetcode.cn/problems/pascals-triangle/ 杨辉三角&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 核心思想&#xff1a;找出杨辉三角的规律&#xff0c;发…

mybatis调用Oracle存储过程 带游标

目录 存储过程 调用测试 游标 Mapper.xml Mapper 调用测试 结果 存储过程 CREATE OR REPLACE PROCEDURE proc_test2(p_id IN NUMBER,v_cur OUT SYS_REFCURSOR,p_result_code OUT NUMBER,p_result_message OUT VARCHAR2) AS BEGINp_result_m…

阿里云服务器固定带宽实际下载速度表,不只是3M固定带宽

阿里云服务器公网带宽上传和下载速度对照表&#xff0c;1M带宽下载速度是128KB/秒&#xff0c;为什么不是1M/秒&#xff1f;阿里云服务器网aliyunfuwuqi.com分享阿里云服务器带宽1M、2M、3M、5M、6M、10M、20M、30M、50M、100M及200M等公网带宽下载速度对照表&#xff0c;附带宽…

安科瑞电力物联网系统在电力设备在线监测中的应用——安科瑞 顾烊宇

摘要&#xff1a;近年来&#xff0c;社会经济发展速度不断提升&#xff0c;对电力能源的需求大幅增加&#xff0c;为保障变电站等电力设备合理发挥功能&#xff0c;保障供电安全性和稳定性&#xff0c;应当加强对电力设备的监测和管理。而电力物联网技术是现代一种安全工器具的…

一文搞定JVM内存模型

鲁大猿&#xff0c;寻精品资料&#xff0c;帮你构建Java全栈知识体系 www.jiagoujishu.cn 运行时数据区 内存是非常重要的系统资源&#xff0c;是硬盘和 CPU 的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、…

application.properties 如何改成 application.yml

Convert YAML and Properties File 右键直接转换即可 Further Reading &#xff1a; idea 常用插件

月报总结|Moonbeam 12月份大事一览

一转眼已经到年底啦。本月&#xff0c;Moonbeam基金会发布四个最新战略重点&#xff1a;跨链解决方案、游戏、真实世界资产&#xff08;RWA&#xff09;、新兴市场。其中在新兴市场方面&#xff0c;紧锣密鼓地推出与巴西公司Grupo RO的战略合作。 用户教育方面&#xff0c;为了…

详解Java中的原子操作

第1章&#xff1a;什么是原子操作 大家好&#xff0c;我是小黑&#xff0c;面试中一个经常被提起的话题就是“原子操作”。那么&#xff0c;到底什么是原子操作呢&#xff1f;在编程里&#xff0c;当咱们谈论“原子操作”时&#xff0c;其实是指那些在执行过程中不会被线程调度…

Python | 基于Mediapipe框架的手势识别系统

一、项目要求 1、题目 本题着力于解决会商演示系统中的非接触式人机交互问题&#xff0c;具体而言&#xff0c;其核心问题就是通过计算机视觉技术实现对基于视频流的手势动作进行实时检测和识别。通过摄像头采集并识别控制者连续的手势动作&#xff0c;完成包括点击、平移、缩放…

关于无人机上层控制的PID算法的思考

一、前言 背景介绍&#xff1a;PID虽然出现了很多年&#xff0c;但是目前工业界还是把PID作为主流的控制算法&#xff08;尽管学术界有很多非常时尚的控制算法&#xff0c;包括鲁邦控制&#xff0c;神经网络控制等等&#xff09;&#xff0c;PID的算法在于其不需要对系统进行复…

编程语言的生命力

一、目前主流的编程语言 目前流行的编程语言有很多种&#xff0c;可谓是百花齐放、百家争鸣。根据不同的应用场景和领域&#xff0c;有不同的编程语言被广泛使用。一些目前主流的编程语言HTML5、Python、JavaScript 、Java 、C 、PHP 、Swift 等等。 还有许多其他的编程语言&am…

leetcode算法题之递归--综合练习(二)

本章目录 1.N皇后2.有效的数独3.解数独4.单词搜索5.黄金矿工6.不同路径III 1.N皇后 N皇后 class Solution {vector<vector<string>> ret;vector<string> path;int n;bool checkCol[10],checkDig1[20],checkDig2[20]; public:vector<vector<string&g…

1018:奇数偶数和1028:I love 闰年!和1029:三角形判定

1018&#xff1a;奇数偶数 要求&#xff1a;输入一个整数&#xff0c;判断该数是奇数还是偶数。如果该数是奇数就输出“odd”&#xff0c;偶数就输出“even”&#xff08;输出不含双引号&#xff09;。 输入样例&#xff1a;8 输出样例&#xff1a;even 程序流程图&#xff1a…

解决Canvas画图清晰度问题

最近在开发Web端远程桌面的时候遇到的一个问题&#xff0c;解决记录一下&#xff0c;分享给各位有需要用到的朋友。 先吹下水&#xff1a;远程桌面的连接我们是通过Websocket连接后&#xff0c;后端不断返回远程端的界面二进制数据流&#xff0c;我接收到之后转为图像&#xf…

MySQL练习-DDL语法练习

文章目录 1、数据库操作2、表操作3、DDL数据类型 突然想起来好久没写过SQL了&#xff0c;写一下SQL练习一下&#x1f60a; 个人写sql比较喜欢用小写&#x1f601; 什么是DDL&#xff1a;DDL是对数据库和表的操作 在这里练习DLL的时候先不添加约束&#xff0c;后面会把约束集中…

YOLOv8模型yaml结构图理解(逐层分析)

前言 YOLO-V8&#xff08;官网地址&#xff09;&#xff1a;https://github.com/ultralytics/ultralytics 一、yolov8配置yaml文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨架&#xff08;backbone&#xff09;和头部&#xff08;hea…

迟到的总结:回望 2023 年,期盼 2024 新机会、新挑战

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、RocketMQ&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏…

2023湾区产城创新大会:培育数字化供应链金融新时代

2023年12月26日&#xff0c;由南方报业传媒集团指导&#xff0c;南方报业传媒集团深圳分社主办的“新质新力——2023湾区产城创新大会”在深圳举行。大会聚集里国内产城研究领域的专家学者以及来自产业园区、金融机构、企业的代表&#xff0c;以新兴产业发展为议题&#xff0c;…