linux下io操作详细解析

在 Linux 系统下,IO(输入/输出)操作是程序与外部设备(如文件、网络等)交互的重要方式。Linux 提供了丰富的系统调用和库函数来支持各种 IO 操作。以下是对 Linux 下 IO 操作的详细解析,包括文件 IO、网络 IO 和缓冲机制等内容。


一、文件 IO 操作

1. 打开文件(open 系统调用)

open 系统调用用于打开一个文件,返回一个文件描述符(file descriptor),后续操作都通过这个文件描述符进行。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fd = open("example.txt", O_RDONLY); // 打开文件用于只读if (fd == -1) {perror("open failed");return 1;}std::cout << "File opened successfully, file descriptor: " << fd << std::endl;close(fd); // 关闭文件return 0;
}
  • O_RDONLY:只读模式。

  • O_WRONLY:只写模式。

  • O_RDWR:读写模式。

  • O_CREAT:如果文件不存在,则创建文件。

  • O_TRUNC:如果文件已存在,将其长度截断为 0。

  • O_APPEND:写入时将数据追加到文件末尾。

2. 读取文件(read 系统调用)

read 系统调用从文件描述符指定的文件中读取数据。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open failed");return 1;}char buffer[128];ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead == -1) {perror("read failed");close(fd);return 1;}buffer[bytesRead] = '\0'; // 确保字符串以 null 结尾std::cout << "Read " << bytesRead << " bytes: " << buffer << std::endl;close(fd);return 0;
}
  • read 返回读取的字节数,如果返回 0 表示已到达文件末尾,返回 -1 表示出错。

3. 写入文件(write 系统调用)

write 系统调用将数据写入到文件描述符指定的文件中。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open failed");return 1;}const char* msg = "Hello, world!";ssize_t bytesWritten = write(fd, msg, strlen(msg));if (bytesWritten == -1) {perror("write failed");close(fd);return 1;}std::cout << "Wrote " << bytesWritten << " bytes." << std::endl;close(fd);return 0;
}
  • O_CREAT:如果文件不存在,则创建文件。

  • 0644:文件权限,表示所有者有读写权限,组用户和其他用户有读权限。

4. 关闭文件(close 系统调用)

close 系统调用用于关闭文件描述符,释放资源。

close(fd);

二、网络 IO 操作

1. 创建套接字(socket 系统调用)

socket 系统调用用于创建一个套接字,用于网络通信。

#include <sys/types.h>
#include <sys/socket.h>
#include <iostream>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建 TCP 套接字if (sockfd == -1) {perror("socket failed");return 1;}std::cout << "Socket created successfully, file descriptor: " << sockfd << std::endl;close(sockfd);return 0;
}
  • AF_INET:IPv4 地址族。

  • SOCK_STREAM:TCP 套接字。

  • SOCK_DGRAM:UDP 套接字。

2. 绑定地址(bind 系统调用)

bind 系统调用将套接字绑定到一个本地地址和端口。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket failed");return 1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080); // 端口号addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有可用地址if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {perror("bind failed");close(sockfd);return 1;}std::cout << "Socket bound to port 8080." << std::endl;close(sockfd);return 0;
}

3. 监听连接(listen 系统调用)

listen 系统调用将套接字设置为监听状态,等待客户端连接。

if (listen(sockfd, 5) == -1) { // 最大连接队列长度为 5perror("listen failed");close(sockfd);return 1;
}std::cout << "Server is listening on port 8080." << std::endl;

4. 接受连接(accept 系统调用)

accept 系统调用接受一个客户端连接,返回一个新的套接字用于与客户端通信。

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);
if (clientfd == -1) {perror("accept failed");close(sockfd);return 1;
}std::cout << "Client connected." << std::endl;

5. 读写网络数据

使用 readwrite 系统调用(或 recvsend 函数)进行网络数据的读写。

char buffer[1024];
ssize_t bytesRead = read(clientfd, buffer, sizeof(buffer) - 1);
if (bytesRead == -1) {perror("read failed");close(clientfd);close(sockfd);return 1;
}buffer[bytesRead] = '\0';
std::cout << "Received message: " << buffer << std::endl;const char* response = "Hello, client!";
write(clientfd, response, strlen(response));

三、缓冲机制

1. 标准 IO 缓冲

C 标准库提供了缓冲机制,通过 FILE* 指针操作文件。例如:

#include <cstdio>
#include <iostream>int main() {FILE* file = fopen("example.txt", "r");if (!file) {perror("fopen failed");return 1;}char buffer[128];while (fgets(buffer, sizeof(buffer), file)) {std::cout << buffer;}fclose(file);return 0;
}
  • fgets 从文件中读取一行,自动处理缓冲。

  • fputs 将字符串写入文件,也使用缓冲机制。

2. 系统调用与缓冲

系统调用(如 readwrite)通常不使用缓冲,直接与内核交互。如果需要缓冲,可以手动实现,例如:

char buffer[1024];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer));

3. 非阻塞 IO 和异步 IO

  • 非阻塞 IO:通过设置文件描述符为非阻塞模式,使 readwrite 在数据未准备好时立即返回

    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  • 异步 IO:使用 aioio_uring 等机制,允许程序在 IO 操作完成之前继续执行。

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

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

相关文章

wsl2+ubuntu22.04安装blender教程(详细教程)

本章教程介绍,如何在Windows操作系统上通过wsl2+ubuntu安装blender并运行教程。Blender 是一款免费、开源的 ​​3D 创作套件​​,广泛应用于建模、动画、渲染、视频编辑、特效制作等领域。它由全球开发者社区共同维护,支持跨平台(Windows、macOS、Linux),功能强大且完全…

目标检测YOLO实战应用案例100讲- 基于卷积神经网络的小目标检测算法研究与应用

目录 知识储备 基于改进YOLOv5的小目标检测算法 一、环境配置(Python 3.8+) 二、核心代码实现 1. 改进模型定义(models/yolov5s_tiny.py ) 2. 小目标数据增强(datasets/tiny_aug.py ) 3. 训练脚本(train.py ) 三、关键改进点说明 四、实验配置建议 前言 传统…

智能DNS解析:解决高防IP地区访问异常的实战指南

摘要&#xff1a;针对高防IP在部分地区无法访问的问题&#xff0c;本文设计基于智能DNS的流量调度方案&#xff0c;提供GeoDNS配置与故障切换代码示例。 一、问题背景 运营商误拦截或线路波动可能导致高防IP在福建、江苏等地访问异常。传统切换方案成本高&#xff0c;智能DNS可…

根据 PID 找到对应的 Docker 容器

引言 在日常运维与调试过程中&#xff0c;我们常常需要查找某个进程所属的 Docker 容器。当系统出现问题或资源异常时&#xff0c;根据进程的 PID 找到其所属容器可以帮助我们迅速定位问题。本文将介绍如何利用 Linux 的 cgroup 机制&#xff0c;以及 Docker 提供的工具来完成…

NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)

多重背包 多重背包问题有两种解法&#xff1a; 按照背包问题的常规分析⽅式&#xff0c;仿照完全背包&#xff0c;第三维枚举使⽤的个数&#xff1b;利⽤⼆进制可以表⽰⼀定范围内整数的性质&#xff0c;转化成01 背包问题。 ⼩建议&#xff1a;并不是所有的多重背包问题都能…

【远程工具】0 std::process::Command 介绍

std::process::Command 是 Rust 标准库中用于创建和配置子进程的主要类型。它允许你启动新的进程、设置其参数和环境变量、重定向输入/输出等。 基本用法 use std::process::Command;let output Command::new("echo").arg("Hello, world!").output().ex…

【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统获取图书列表接口(后端:计算图书页数、查询当前页展示的书籍)

图书列表 实现服务器代码(计算图书总数量查询当前页需要展示的书籍) 后端响应时&#xff0c;需要响应给前端的数据 records&#xff1a;第 pageNum 页要展示的图书有哪些&#xff08;存储到List集合中&#xff09;total&#xff1a;计算一共有多少本书&#xff08;用于告诉前…

如何在idea中快速搭建一个Spring Boot项目?

文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动&#xff08;热部署&#xff09;结语 前言 Spring Boot 凭借其便捷的开发特性&#xff0c;极大提升了开发效率&#xff0c;为 Java 开发工作带来诸多便利。许多大伙伴希望快速…

制作前的关键筹备:考试考核系统之核心要点

明确系统使用目的​ 制作考试考核系统前&#xff0c;企业需明确系统使用目的&#xff0c;这是开发基石&#xff0c;不同目的决定系统功能特性。用于员工培训考核时&#xff0c;系统要与培训内容结合&#xff0c;能生成相应考题&#xff0c;检验员工知识掌握程度&#xff0c;具备…

Springboot把外部jar包打包进最终的jar包,并实现上传服务器

1、创建lib目录&#xff0c;把jar包放进这个目录下&#xff0c;然后标记lib目录为“资源根路径”&#xff08;鼠标右键lib目录->将目录标记为->资源根路径。之后lib文件夹会有如下的图标变化&#xff09; 文件结构如下&#xff1a; 2、pom文件添加依赖 <dependency…

内容中台的核心架构是什么?

数据中枢与服务API架构 在内容中台的核心架构中&#xff0c;数据中枢作为基础层&#xff0c;通过统一的数据模型与标准化接口&#xff0c;实现多源内容的集中存储与治理。其核心能力体现在对结构化与非结构化数据的清洗、分类及跨系统同步&#xff0c;例如整合企业内部的CRM、…

Light RPC:一款轻量高效的Java RPC框架实践指南

Light RPC&#xff1a;一款轻量高效的Java RPC框架实践指南 一、框架简介二、快速入门1. 环境准备2. 服务端配置2.1 添加依赖2.2 YAML配置2.3 接口与实现 3. 客户端配置3.1 添加依赖3.2 YAML配置3.3 客户端调用 三、核心设计解析四、适用场景与优势对比五、总结 一、框架简介 …

Hologres实时数仓在B站游戏的建设与实践

一、背景 实时数据仓库是近年来数据技术领域内的一大发展潮流。构建一个能够实现高吞吐量写入与更新、端到端全链路实时处理以及低延迟、高并发的实时数据仓库&#xff0c;一直是众多企业面临的重大挑战。随着B站游戏业务的快速发展&#xff0c;对数据的实时应用需求也日益增加…

Android WiFi协议之P2P介绍与实践

Android WiFi P2P WiFi P2P (Peer-to-Peer) 是 Android 提供的一种允许设备之间直接通过 WiFi 进行通信的技术&#xff0c;无需接入传统的 WiFi 网络或互联网。这种技术也被称为 WiFi Direct。 一、WiFi P2P 基本概念 1. 核心组件 P2P 设备&#xff1a;支持 WiFi P2P 的 And…

浅谈在HTTP中GET与POST的区别

从 HTTP 报文来看&#xff1a; GET请求方式将请求信息放在 URL 后面&#xff0c;请求信息和 URL 之间以 &#xff1f;隔开&#xff0c;请求信息的格式为键值对&#xff0c;这种请求方式将请求信息直接暴露在 URL 中&#xff0c;安全性比较低。另外从报文结构上来看&#xff0c…

若依微服务集成Flowable仿钉钉工作流

项目简介 本项目工作流模块集成在若依项目单独一个模块&#xff0c;可实现单独运行部署&#xff0c; 前端采用微前端&#xff0c;嵌入在若依的前端项目中。因博主是后端开发&#xff0c;对前端不是太属性&#xff0c;没将工作流模块前端代码移到若依前端。下面贴上代码工程结构…

WPS JS宏编程教程(从基础到进阶)-- 第六部分:JS集合与映射在 WPS 的应用

目录 第6章 JS集合与映射在 WPS 的应用6-1 集合的创建(实例:唯一值提取)示例代码详细解析Excel 环境模拟说明6-2 集合的不重复特性应用(案例:提取唯一值记录)示例代码详细解析案例说明6-3 集合成员添加与删除示例代码代码解析直观示意(Excel 模拟表格)6-4 集合成员添加…

MySQL 约束(入门版)

目录 一、约束的基本概念 二、约束演示 三、外键约束 &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;外键约束语法 &#xff08;三&#xff09;删除/更新行为 一、约束的基本概念 1、概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储…

【ISP】ISP pipeline(AI)

ISP Pipeline 全流程概览 ISP&#xff08;Image Signal Processing&#xff0c;图像信号处理&#xff09;流程通常从原始 Bayer 数据出发&#xff0c;经过一系列模块处理&#xff0c;逐步完成图像校正和增强&#xff0c;最终生成用于显示或编码的标准图像。常见处理模块包括&a…

【Rust开发】Rust快速入门,开发出Rust的第一个Hello World

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…