Linux中的 read() 函数的介绍及使用实例

read() 函数的介绍

Linux 的 read() 函数简介

read() 是一个 POSIX 标准的系统调用,用于从文件或文件描述符中读取数据。它是用户空间与内核空间交互的重要接口之一。


函数原型

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
  • fd: 文件描述符,表示要读取的文件或设备,通常由 open() 或其他函数返回。
  • buf: 缓冲区的指针,用于存储读取到的数据。
  • count: 要读取的最大字节数。

返回值

  • 成功时
    • 返回实际读取的字节数。
    • 如果返回值为 0,表示文件已到达末尾(EOF)。
  • 失败时
    • 返回 -1,并设置 errno,可以通过 perror()strerror(errno) 查看错误信息。

read() 的功能

  1. 文件读取
    • 从普通文件中读取内容,逐字节传输数据到缓冲区。
  2. 设备读取
    • 可从设备文件(如 /dev/ 下的文件)读取数据,处理硬件事件或状态。
  3. 管道读取
    • 在管道或套接字通信中,read() 用于接收数据。
  4. 标准输入读取
    • 通过文件描述符 0read() 可读取标准输入的数据。

常见错误及其原因

  1. EINTR:调用被信号中断,需重试。
  2. EBADF:无效的文件描述符。
  3. EFAULTbuf 指向的内存地址无效。
  4. EINVAL:无效的参数,如文件描述符未配置为可读。
  5. EIO:I/O 错误,通常与硬件问题相关。

注意事项

  1. 字节数不一定等于请求的字节数
    • 网络、设备文件等读取可能返回比 count 小的字节数,需循环调用 read() 读取完整数据。
  2. 多线程环境
    • 确保线程间对文件描述符的访问互斥。
  3. 与非阻塞 I/O 配合
    • 如果文件描述符是非阻塞模式,read() 可能返回 0-1errnoEAGAINEWOULDBLOCK),需要检查并重试。

小结

read() 是 Linux 系统中基本的 I/O 操作接口,用于从文件描述符中读取数据。通过合理使用它,可以完成对文件、设备和网络数据的高效读取。

实例1

ret = read(ts->fd, &ev, sizeof(struct input_event));

这行代码涉及Linux中的 read() 函数,用于从文件描述符中读取数据。让我们逐步拆解其含义:

  1. ret

    • 变量 ret 用于接收 read() 函数的返回值,表示实际读取到的字节数。如果读取失败,read() 会返回 -1,并设置 errno 以指示错误类型。
  2. read(ts->fd, &ev, sizeof(struct input_event))

    • read() 是一个系统调用,用于从文件描述符(fd)中读取数据。
    • ts->fd:这是一个文件描述符,通常代表一个已打开的文件、设备或其他资源。在这个例子中,可能是一个输入设备文件(例如 /dev/input/eventX),与 Linux 输入子系统相关。
    • &ev:这是一个指向内存缓冲区的指针,用于存储读取到的数据。
    • sizeof(struct input_event):指定了读取的数据大小,这里等于 struct input_event 的大小。
  3. struct input_event

    • 这是 Linux 输入子系统中的一个标准结构,定义在头文件 <linux/input.h> 中,通常用于描述输入事件。
    • 它的常见字段包括:
      • struct timeval time:事件发生的时间戳。
      • __u16 type:事件的类型,例如按键、鼠标移动等。
      • __u16 code:事件的具体代码,表示哪个按键或动作。
      • __s32 value:事件的值,例如按键按下、松开或鼠标位置的变化。
  4. 代码逻辑的含义

    • 通过调用 read(),从文件描述符 ts->fd 中读取一个输入事件的数据,并存储在 ev 结构体中。
    • 返回值 ret
      • 如果 ret > 0:表示成功读取了 ret 字节,通常应该等于 sizeof(struct input_event)
      • 如果 ret == 0:表示文件已到达末尾(对于某些设备文件,这种情况可能不会发生)。
      • 如果 ret == -1:表示发生错误,应检查 errno 以获取错误原因。
  5. 应用场景

    • 这种代码通常出现在处理 Linux 输入设备的程序中,用于读取键盘、鼠标或其他输入设备的事件。

总结
这行代码的作用是从一个输入设备(通过文件描述符 ts->fd)读取一个输入事件,将其存储到 ev 变量中,并通过返回值 ret 指示读取结果。

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

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

相关文章

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject&#xff1a;主题plainBody&#xff1a; 纯文本正文htmlBody&#xff1a;超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…

基于深度学习多图像融合的屏幕缺陷检测方案

公司项目&#xff0c;已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展&#xff0c;因其自主学习图像数据特征的性能避免了人工设计算法的繁琐&#xff0c;精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能&#xff0c;使得深度学习技术在…

【数据库】Redis—Java 客户端

一、常见的几种 Java 客户端 Jedis&#xff1a;以 Redis 命令作为方法的名称&#xff0c;便于学习&#xff0c;简单实用&#xff0c;但其实例是线程不安全的&#xff0c;多线程下需要基于连接池来使用。lettce&#xff1a;基于 Netty 实现&#xff0c;支持同步、异步和响应式编…

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

SAP抓取外部https报错SSL handshake处理方法

一、问题描述 SAP执行报表抓取https第三方数据,数据获取失败。 报错消息: SSL handshake with XXX.COM:449 failed: SSSLERR_SSL_READ (-58)#SAPCRYPTO:SSL_read() failed##SapSSLSessionStartNB()==SSSLERR_SSL_READ# SSL:SSL_read() failed (536875120/0x20001070)# …

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

信奥赛四种算法描述

#include <iostream> #include <iomanip> using namespace std;// 使用unsigned long long类型来尽量容纳较大的结果&#xff0c;不过实际上这个数值极其巨大&#xff0c;可能最终仍会溢出 // 更好的方式可以考虑使用高精度计算库&#xff08;如GMP等&#xff09;来…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

vscode 使用说明

文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff…

多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用

此护照阅读器支持护照、电子芯片护照、港澳通行证、台湾通行证&#xff0c;和串口的被动的方式不一样。此护照阅读器通电后&#xff0c;自动读卡&#xff0c;串口输出&#xff0c;软件只需要去串口监听数据即可&#xff0c;例如用串口助手就可以收到读卡信息。 非常适用于单片…

petalinux-adi ---移植adi内核(一)

1. 设备树生成 将 前 面 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在Petalinux 工 程 的components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 …

基于MindSpore NLP的PEFT微调

创建notebook 登录控制台 创建notebook 如果出现提示按如下操作 回到列表页面创建notebook参数如下&#xff1a; 配置mindnlp环境 打开GitHub - mindspore-lab/mindnlp: Easy-to-use and high-performance NLP and LLM framework based on MindSpore, compatible with model…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

Redis存在安全漏洞

Redis是美国Redis公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值&#xff08;Key-Value&#xff09;存储数据库&#xff0c;并提供多种语言的API。 Redis存在安全漏洞。攻击者利用该漏洞使用特制的Lua脚本触发堆栈缓冲区溢出漏洞&#xff0c;从…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

ubuntu22.04 nginx配置下载目录,亲测成功

安装nginx ubuntu最简单&#xff0c;apt安装即可 apt install nginx 配置文件 文件都在目录下 /etc/nginx/添加内容 修改/ etc/nginx/sites-available/default &#xff0c; 注意这里不是nginx.conf&#xff0c;直接修改nginx.conf不奏效 location /downloads { …

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

android EditText密码自动填充适配

android上的密码&#xff08;其实不仅仅是密码&#xff0c;可以是用户名也可以是邮箱&#xff09;自动填充&#xff0c;是需要考虑适配的。 官方文档&#xff1a;https://developer.android.com/identity/autofill/autofill-optimize?hlzh-cn 什么是自动填充 手机厂商一般会…