Linux 文件 I/O 基础

目录

前言

一、文件描述符(File Descriptor)

二、打开文件(open 函数)

三、读取文件(read 函数)

四、写入文件(write 函数)

五、关闭文件(close 函数) 

六、总结


前言

在 Linux 系统编程的世界里,文件 I/O 操作是至关重要的一环。无论是系统管理员进行配置文件的读写,还是开发者处理应用程序的数据存储与读取,掌握 Linux 文件 I/O 基础都是必备技能。今天,就让我们一同深入探索 Linux 文件 I/O 的基础知识。

一、文件描述符(File Descriptor)

在 Linux 中,文件描述符是一个非负整数,用于标识一个打开的文件。当我们打开一个文件时,操作系统会返回一个文件描述符,后续对该文件的操作(如读、写、关闭等)都通过这个文件描述符来进行。

例如,当我们使用 open 函数打开一个文件时:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>int main() {int fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("open");return -1;}// 在这里可以使用 fd 对文件进行操作close(fd);return 0;
}

在上述代码中,open 函数尝试打开名为 "test.txt" 的文件,以只读方式(O_RDONLY)打开。如果打开成功,返回的文件描述符 fd 就可以用于后续的读操作,最后通过 close 函数关闭文件,释放相关资源。

二、打开文件(open 函数)

open 函数用于打开一个文件,其原型如下:

#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_CREAT(如果文件不存在则创建)、O_TRUNC(打开文件时将其截断为 0 长度)等。

 

mode:当使用 O_CREAT 标志创建文件时,需要指定文件的权限模式,例如 0644 表示所有者具有读写权限,组用户和其他用户具有读权限。

三、读取文件(read 函数)

read 函数用于从文件描述符指定的文件中读取数据,其原型为:

#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符。
  • buf:用于存储读取数据的缓冲区。
  • count:要读取的字节数。

例如:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {int fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("open");return -1;}char buffer[100];ssize_t bytesRead = read(fd, buffer, sizeof(buffer));if (bytesRead == -1) {perror("read");close(fd);return -1;}buffer[bytesRead] = '\0';printf("读取到的数据:%s\n", buffer);close(fd);return 0;
}

在这段代码中,首先打开文件,然后使用 read 函数从文件中读取数据到 buffer 中,最后将读取到的数据输出并关闭文件。

四、写入文件(write 函数)

write 函数用于向文件描述符指定的文件中写入数据,原型如下:

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符。
  • buf:要写入的数据的缓冲区。
  • count:要写入的字节数。

例如:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open");return -1;}const char *data = "Hello, Linux File I/O!";ssize_t bytesWritten = write(fd, data, strlen(data));if (bytesWritten == -1) {perror("write");close(fd);return -1;}printf("写入的字节数:%ld\n", bytesWritten);close(fd);return 0;
}

这段代码打开一个文件(如果不存在则创建,存在则截断),然后向文件中写入一个字符串,并输出写入的字节数,最后关闭文件。

五、关闭文件(close 函数) 

close 函数用于关闭一个打开的文件,释放相关资源,其原型为:

#include <unistd.h>int close(int fd);
  • fd:要关闭的文件的文件描述符。

及时关闭文件是一个良好的编程习惯,可以避免资源泄漏和其他潜在的问题。

六、总结

Linux 文件 I/O 基础操作虽然看似简单,但却是系统编程中不可或缺的部分。通过熟练掌握文件描述符、打开、读取、写入和关闭文件等基本操作,我们可以在 Linux 系统上进行各种复杂的文件处理任务,为进一步深入学习系统编程打下坚实的基础。希望这篇文章能帮助你对 Linux 文件 I/O 有一个初步的理解和掌握。

 

 

 

 

 

 

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

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

相关文章

【CSS in Depth 2 精译_091】15.4:让 CSS 高度值过渡到自动高度 + 15.5:自定义属性的过渡设置(全新)+ 15.6:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 15.2.1 定制贝塞尔曲线15.2.2 阶跃 15.3 非动画属性 15.3.1 不可添加动画效果的属性15.3.2 淡入与淡出 15.4 过…

路由器的原理

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器的原理一&#xff0c;路由器基础及相关…

硬件设计:LVDS电平标准

什么是LVDS&#xff1f; LVDS&#xff08;Low-Voltage Differential Signaling&#xff09;是一种高速、低功耗的差分信号传输标准。它通过一对差分信号线&#xff08;通常是两根互补信号线&#xff09;来传输数据&#xff0c;广泛应用于高速数字通信领域。 LVDS 的核心特点 低…

spring专题笔记(七):spring如何引入外部属性文件?spring在xml配置bean时如何引入外部的properties属性文件内容?

目录 1、spring在xml配置bean时引入外部的properties属性文件内容作用是什么&#xff1f; 2、引入配置文件步骤 2.1、首先创建一个java类MyDataSource&#xff0c;主要包含四个属性。 2.2、准备一个myDataConfig.properties属性文件&#xff0c;里面配置MyDataSource类中需…

梳理你的思路(从OOP到架构设计)_认识框架(Framework) 01

目录 1、 是框架的核心要素​编辑&i> 范例1&#xff1a; 范例2&#xff1a; 范例3&#xff1a; 1、 <E&I>是框架的核心要素 在特定领域(Domain)里&#xff0c;将EIT造形的<E&I>部份有意义地组合起来&#xff0c;就成为框架(Framework)了。基本…

邮件白名单是什么?

邮件白名单是一种电子邮件过滤规则&#xff0c;用于指定哪些发件人、域名或IP地址的邮件被允许通过过滤系统&#xff0c;不受任何限制地进入收件人的邮箱。与黑名单&#xff08;用于阻止特定发件人的邮件&#xff09;相反&#xff0c;白名单确保了来自受信任来源的邮件能够畅通…

Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中&#xff0c;可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe&#xff0c;但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe&#xff0c;比如&#xff1a; 因为不需要经常运行 OpenRewrite&#xff0c;所以不想在pom.xml 加入不常使用的插件…

JVM实战—2.JVM内存设置与对象分配流转

大纲 1.JVM内存划分的原理细节 2.对象在JVM内存中如何分配如何流转 3.部署线上系统时如何设置JVM内存大小 4.如何设置JVM堆内存大小 5.如何设置JVM栈内存与永久代大小 6.问题汇总 1.JVM内存划分的原理细节 (1)背景引入 (2)大部分对象的存活周期都是极短的 (3)少数对象…

外部化内部类

要定义一个新的名字空间&#xff0c;将一个类内部的类提到外部&#xff0c;目的是降低类的耦合度和复杂度&#xff0c;这通常可以通过 外部化内部类 来实现。通过这种方式&#xff0c;可以将复杂的实现细节分离到一个单独的名字空间中&#xff0c;让外部类的接口保持简洁。接下…

创建仓颉编程语言的第一个项目

创建仓颉编程语言的第一个项目 安装仓颉编程语言编译器第一个仓颉项目 安装仓颉编程语言编译器 安装仓颉编程语言编译器&#xff0c;是一个需要非常强的动手能力的过程——有大量的命令行操作。这不是仓颉编程语言独有的特点。现在流行的编程语言&#xff0c;比如 kotlin、jav…

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…

计算机网络:IP地址相关知识总结

目录 一、IP地址的表现形式 1.1 十进制表示形式 1.2 二进制表示形式 1.3 转换示例介绍 二、IP地址的组成 2.1 网络ID 2.2 主机ID 2.3 示例 三、IP地址的分类 3.1 A类地址 3.2 B类地址 3.3 C类地址 3.4 D类地址 3.5 E类地址 四、常见的特殊IP地址 五、IP地址二进…

基础练习 Huffman树,C++,最小堆,STL

Description Huffman树在编码中有着广泛的应用。在这里&#xff0c;我们只关心Huffman树的构造过程。 给出一列数{pi}{p0, p1, …, pn-1}&#xff0c;用这列数构造Huffman树的过程如下&#xff1a; 1. 找到{pi}中最小的两个数&#xff0c;设为pa和pb&#xff0c;将pa和pb从{…

Java获取自身被调用点

1. 场景 打印日志的时候&#xff0c;需要获取是在哪个地方被调用了&#xff0c;把调用点的信息一并打印出来。 2. 获取自身被调用点的方法 可以通过获取线程的调用栈&#xff0c;遍历后找到调用点。 3. 代码实现 import java.text.SimpleDateFormat; import java.util.Dat…

vue3入门教程:teleport

一、基本语法 Teleport组件的基本语法如下&#xff1a; <Teleport to"目标选择器"><!-- 要传送的内容 --> </Teleport>其中&#xff0c;to属性指定了内容将被渲染到的目标位置&#xff0c;它可以是一个CSS选择器字符串&#xff08;如#some-id、.…

群晖Cloud Sync一键同步让数据管理变得简单

前言&#xff1a;在这个数字化爆炸的时代&#xff0c;数据管理和备份已经变得不可或缺。无论是个人用户还是企业&#xff0c;都需要一种既高效又可靠的方式来管理和备份分散在各种设备和云存储中的文件。而群晖的 **Cloud Sync** 套件正是为了解决这个问题而生。 Cloud Sync 是…

docker 部署mysql8

在Docker中部署MySQL 8是一个相对简单的过程。以下是基本的步骤&#xff1a; 拉取MySQL 8镜像&#xff1a; 使用Docker命令拉取最新的MySQL 8镜像&#xff1a; docker pull registry.openanolis.cn/openanolis/mysql:8.0.30-8.6创建并运行MySQL容器&#xff1a; 创建并运行MySQ…

Triple三倍

time limit per test 1 second memory limit per test 256 megabytes Given an array aa of nn elements, print any value that appears at least three times or print -1 if there is no such value. Input The first line contains an integer tt (1≤t≤1041≤t≤10…

GPIO+TIM(无PWM)实现呼吸灯功能

程序特点&#xff1a; 1、模块化&#xff0c;可快速移植&#xff0c;5分钟便可完成移植。 2、通过GPIO普通定时器&#xff0c;实现呼吸灯功能。 3、PWM周期为5ms&#xff0c;占空比调节时间为20ms&#xff0c;占空比为100等份&#xff0c;即呼吸灯从暗到亮需要20ms*1002s。 …