有关linux中的文件IO的操作

news2024/12/25 12:38:54

        Linux 应用编程中最需要掌握的基础就是文件 I/O的操作,学习过linux或者有过了解的应该都会听过一句话:linux中一切皆文件,文件是linux系统的核心设计思想。所以掌握文件的操作是很重要的。

        那文件 I/O 又是什么?文件I/O指的是对文件的输入/输出操作,简单点说就是对文件进行的读写操作,包括打开文件、关闭文件、从文件中读取数据和向文件中写入数据等的操作。

        本文就分享linux下的一些文件的简单操作,涉及文件描述符、文件打开、读文件、写文件、文件指针lseek。

1、文件描述符(fd)

linux中打开的文件不管是现有文件还是新创建的文件,内核都会为文件分配一个编号,这个编号用于指代这个被打开的文件,在IO操作中会返回到进程中,这个编号就是文件描述符。

文件描述符对于一个进程来说是一种有限资源,并不是无限的。

一个进程中的文件描述符是从 0 开始分配的,一直到最大的文件描述的数量位置。

假如说进程中最大的文件描述符数量为1024个,而第一个被打开的文件对应的文件描述符是 0、第二个文件是 1、第三个文件是 2、第 4 个文件是 3……以此类推,所以由此可知,文件描述符数字最大值为 1023(0~1023)。

每一个被打开的文件在同一个进程中都有一个唯一的文件描述符,不会重复,如果文件被关闭后,它对应的文件描述符将会被释放,那么这个文件描述符将可以再次分配给其它打开的文件、与对应的文件绑定起来。

对于linux系统中进程允许打开的最大的文件数是多少,可以用指令进行查看,如下:

ulimit -n

如下示例:

        注意:在实际使用中,我们在程序调用函数打开文件的时,分配的文件描述符一般都是从 3 开始,0、1、2 这三个文件描述符是默认被系统占用的,它们分配给了系统标准输入(0)、标准输出(1)、标准错误(2)。

2、文件打开操作(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);

        使用linux时,如果想要查看某些系统调用API函数的原型和用法,可以通过man命令获得帮助,如下:
man 2 open

函数open的帮助如下:

3、文件读操作(read)

        当使用open函数成功打开一个文件之后,就可以使用read函数读取文件中的内容,同样可以使用man指令查询read函数的用法,如下:

        read函数的原型如下:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

4、文件写操作(write)

        调用 write 函数可向打开的文件写入数据,通过man 2 write 可以查看该函数的用法,如下:

函数原型如下:

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

5、文件指针偏移(lseek)

        每个打开的文件,系统都会记录它的读写位置偏移量,也把这个读写位置偏移量称为文件指针,它记录了文件当前的读写位置。

        当调用 read()或 write()函数对文件进行读写操作时,会从当前读写位置偏移量开始进行数据读写。

        并且这个偏移量是以相对于文件头部的位置开始偏移的,文件第一个字节数据的位置偏移量为 0。

        所以有些时候我们对文件进行操作时是需要知道文件当前的偏移位置在哪里的。又或者说需要从文件的某些位置开始操作时,就需要设置文件指针的偏移,这样才能让我们操作到需要操作的文件的位置。

        设置文件指针偏移的函数为lseek,它的函数原型如下:

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

函数参数如下:

fd :文件描述符。
offset :偏移量,以字节为单位。
whence :用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种:
  1)SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算);
  2)SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处,offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
  3)SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,如果是正数表示往后偏移、如果是负数则表示往前偏移。

返回值:

成功将返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置;发生错误将返回-1。

该函数的使用示例:

1)将读写位置移动到文件开头处:
off_t offSet = lseek(fd, 0, SEEK_SET);

2将读写位置移动到文件末尾:
off_t offSet = lseek(fd, 0, SEEK_END);

3将读写位置移动到偏移文件开头 500 个字节处:
off_t offSet = lseek(fd, 500, SEEK_SET);

4获取当前读写位置偏移量:
off_t offSet = lseek(fd, 0, SEEK_CUR);

6、文件关闭操作(close)

        如果一个文件已经执行完操作,以后或者暂时不打算用到,那么这个被打开的文件是需要将其关闭的,文件需要使用时要打开,不再使用时要关闭,这是一种编程的习惯,平时也是需要去注意养成的。

        关闭文件可以使用close,该函数的原型如下:

#include <unistd.h>

int close(int fd);

函数参数和返回值如下:

fd :文件描述符,需要关闭的文件所对应的文件描述符。

返回值:如果成功返回 0,如果失败则返回-1。

        注意:close 函数是用于显式关闭文件的,在 Linux 系统中,如果一个进程终止了,内核会自动关闭这个进程打开的所有文件,这是一种隐式的关闭文件的方式。

 

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

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

相关文章

NumPy transpose 的定义与计算过程

NumPy transpose 的定义与计算过程NumPy documentation https://numpy.org/doc/stable/index.html numpy.transpose https://numpy.org/doc/stable/reference/generated/numpy.transpose.html numpy.ndarray.transpose https://numpy.org/doc/stable/reference/generated/num…

π120M31 10Mbps双通道数字隔离器兼容代替ADuM1200BR

π120M31 10Mbps双通道数字隔离器兼容代替ADuM1200BR 。具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 3.0kV rms 隔离耐压等级和 DC 到 10Mbps 信号传输…

网络通信基础

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 祝大家圣诞快乐&#x1f384; 网络互连的目的是进行网络通信, 也即是网络数据传输, 再具体一点, 是网络主机中的不同进程间, 基于网络传输数据. 那么, 在组建的网络中, 如何判断到底是从哪台主机, 将数据传输到那…

JAVA物联网云平台源码/Modbus/视频接入 物联网智能看板源码

JAVA物联网云平台使用 Java 语言、主流技术组合&#xff08;MQTT、Spring Boot、Shiro、MyBatis、Druid、Ehcache、Thymeleaf、Bootstrap、Swagger&#xff09;开发&#xff0c;支持多数据源&#xff0c;支持代码一键生成。 1、包含物联网云平台源码&#xff08;源码全部开放&a…

【Three.js入门】灯光与阴影、平行光阴影属性、聚光灯的属性和应用

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

百趣代谢组学分享:针灸改善乳腺癌相关性疲劳!非靶代谢组学…

非靶代谢组学肠道菌群测序&#xff1a;改善乳腺癌相关性疲劳—针灸! 文章标题&#xff1a;Acupuncture ameliorates breast cancer-related fatigue by regulating the gut microbiota-gut-brain axis 发表期刊&#xff1a;Frontiers in Endocrinology 影响因子&#xff1…

HTML5 新增元素

文章目录HTML5 新增元素概述headernavarticleasidesectionfooter表单元素新增type属性值&#xff08;验证型&#xff09;新增type属性值&#xff08;取值型&#xff09;output元素addressprogressmeterfigure 和 figcaptionfieldset 和 legendascriptHTML5 新增元素 概述 HTM…

BOM对象

1、什么是BOM BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是 window。 BOM 由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多方法与属性。 BOM 缺乏标…

B端产品-筛选功能如何设计

相信大家在设计B端产品时&#xff0c;最常打交道的就是列表&#xff0c;而列表最常用的一个功能就是搜索&#xff0c;别小看一个简简单单的搜索功能&#xff0c;其实里边的门道也是有很多的。那么如何设计一个好用的搜索栏呢&#xff1f;今天就与大家分享一下&#xff0c;自己负…

【动态规划篇】最少分割回文 编辑距离 不同的子序列

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

音视频技术开发周刊 | 277

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。GNNear&#xff1a;基于近内存处理的大规模图神经网络训练加速器图神经网络(GNNs)已经成为分析非欧几里得图数据的最新算法。然而&#xff0c;实现高效的GNN训练是一项挑战&…

西门子1513CPU冗余组态

西门子1513R冗余配置 1、打开博图16软件&#xff0c;新建项目&#xff0c;添加新设备&#xff0c;在弹出的控制器目录下找到CPU 1513R-1 PN硬件&#xff0c;然后系统自动生成PLC_1和PLC_2&#xff1b; 2、打开设备组态中的网络视图&#xff0c;添加接口模块&#xff1b; 3、在…

Springboot 统计 代码执行耗时时间 ,玩法多到眼花

前言 近日群里有萌新提到关于统计代码执行时间的事&#xff1a; 开始 System.currentTimeMillis() 减去 结束 System.currentTimeMillis() 等于 耗时 其实我个人感觉OK的&#xff0c;就这样就蛮好的&#xff0c;很多项目都是这样用的。 简简单单的挺好。 这一篇就是 …

基于Java( jsp+servlet+javabean)+SQL sever 2017实现(Web)高校选课管理系统【100010058】

一、需求分析 开发意义&#xff1a; 随着信息技术不断向深入发展&#xff0c;越来越多的学校开始着手信息化建设。其中学生选课、成绩信息化管理就是其中重要的一块内容。学生选课与成绩信息规模大、项目条数多、信息量庞大&#xff0c;传统的人工管理方式显然已经无法满足要求…

买不到的数目(蓝桥杯C/C++A组真题详解)

题目详细&#xff1a; 题目思路&#xff1a; 对于这个题有一个定理 如果 a,b 均是正整数且互质&#xff0c;那么由 axby&#xff0c;x≥0&#xff0c;y≥0 不能凑出的最大数是 &#xff1a; a*b-a-b 具体的证明过程这里就不赘述 感兴趣的同学可以自行查找 这里就提供一种思…

rk3568 | rk平台GPIO冲突检测小技巧

上一篇我们讲解了如何编写gpio驱动&#xff0c;但是实际操作中&#xff0c;经常发现gpio引脚被占用的情况发生&#xff0c;那么本篇文章就详细讲解rxw平台下如何快速定位gpio复用问题以及如何解决。 一、GPIO寄存器查找 要想查看某个GPIO引脚可以配置的功能以及地址信息&…

Http协议基础

Http 是什么&#xff1f; Http 作为 WWW 的重要组成部分被提出 (World Wide Web) 而当时的 WWW 是为了帮助研究者更好的进行知识共享 基本理念&#xff1a;文档之间的相互关联形成超文本&#xff0c;最终连成相互参阅的 WWW Http (Hyper Text Transfer Protocol) 用于定义文…

QUIC的优势与缺陷

被寄予厚望的下一代互联网传输协议&#xff0c;QUIC究竟有哪些优点呢&#xff1f; 总结如下&#xff1a; 多路复用&#xff1a;QUIC升华了HTTP/2中的多路复用技术&#xff0c;实现了基于互相独立的多流&#xff08;多通道&#xff09;数据传输&#xff0c;从根本上解决了TCP存在…

基于C语言学生信息教务管理系统编程设计

一.实现功能 1.从键盘添加学生信息 2.从文件添加学生信息 3.显示学生信息到屏幕 4.显示学生信息到文件 5.删除学生信息 6.插入学生信息 7.查找学生信息 8.成绩排名 二、相关代码 #include<stdio.h> #include<stdlib.h> //使用malloc函数以及exit函数 #include<…

力扣(LeetCode)1759. 统计同构子字符串的数目(C++)

题目描述 双指针数学 根据同构字符串的定义&#xff0c;还有示例&#xff0c;发现同构子字符串的数量&#xff0c;只和字母相同的区间有关。如abbcccaa&#xff0c;有 444 个影响答案的区间&#xff0c;直观切分为a bb ccc aa&#xff0c;用空格划分区间。遍历的任务就是维护这…