Linux中的 read() 函数的先容及利用实例

[复制链接]
发表于 2025-11-23 23:03:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
read() 函数的先容

Linux 的 read() 函数简介

read() 是一个 POSIX 标准的体系调用,用于从文件或文件形貌符中读取数据。它是用户空间与内核空间交互的告急接口之一。

函数原型
  1. #include <unistd.h>
  2. ssize_t read(int fd, void *buf, size_t count);
复制代码

  • fd: 文件形貌符,体现要读取的文件或装备,通常由 open() 或其他函数返回。
  • buf: 缓冲区的指针,用于存储读取到的数据。
  • count: 要读取的最大字节数。

返回值


  • 乐成时

    • 返回实际读取的字节数。
    • 假如返回值为 0,体现文件已到达末端(EOF)。

  • 失败时

    • 返回 -1,并设置 errno,可以通过 perror() 或 strerror(errno) 检察错误信息。


read() 的功能


  • 文件读取

    • 从平常文件中读取内容,逐字节传输数据到缓冲区。

  • 装备读取

    • 可从装备文件(如 /dev/ 下的文件)读取数据,处理处罚硬件变乱或状态。

  • 管道读取

    • 在管道或套接字通讯中,read() 用于吸收数据。

  • 标准输入读取

    • 通过文件形貌符 0,read() 可读取标准输入的数据。


常见错误及其缘故起因


  • EINTR:调用被信号制止,需重试。
  • EBADF:无效的文件形貌符。
  • EFAULT:buf 指向的内存所在无效。
  • EINVAL:无效的参数,如文件形貌符未设置为可读。
  • EIO:I/O 错误,通常与硬件标题相干。

注意事项


  • 字节数不肯定即是哀求的字节数

    • 网络、装备文件等读取大概返回比 count 小的字节数,需循环调用 read() 读取完备数据。

  • 多线程情况

    • 确保线程间对文件形貌符的访问互斥。

  • 与非壅闭 I/O 共同

    • 假如文件形貌符好坏壅闭模式,read() 大概返回 0 或 -1(errno 为 EAGAIN 或 EWOULDBLOCK),必要查抄并重试。


小结

read() 是 Linux 体系中根本的 I/O 操纵接口,用于从文件形貌符中读取数据。通过公道利用它,可以完成对文件、装备和网络数据的高效读取。
实例1
  1. ret = read(ts->fd, &ev, sizeof(struct input_event));
复制代码
这行代码涉及Linux中的 read() 函数,用于从文件形貌符中读取数据。让我们徐徐拆解其寄义:

  • ret

    • 变量 ret 用于吸收 read() 函数的返回值,体现实际读取到的字节数。假如读取失败,read() 会返回 -1,并设置 errno 以指示错误范例。

  • read(ts->fd, &ev, sizeof(struct input_event))

    • read() 是一个体系调用,用于从文件形貌符(fd)中读取数据。
    • ts->fd:这是一个文件形貌符,通常代表一个已打开的文件、装备或其他资源。在这个例子中,大概是一个输入装备文件(比方 /dev/input/eventX),与 Linux 输入子体系相干。
    • &ev:这是一个指向内存缓冲区的指针,用于存储读取到的数据。
    • sizeof(struct input_event):指定了读取的数据巨细,这里即是 struct input_event 的巨细。

  • struct input_event

    • 这是 Linux 输入子体系中的一个标准布局,界说在头文件 <linux/input.h> 中,通常用于形貌输入变乱。
    • 它的常见字段包罗:

      • struct timeval time:变乱发生的时间戳。
      • __u16 type:变乱的范例,比方按键、鼠标移动等。
      • __u16 code:变乱的详细代码,体现哪个按键或动作。
      • __s32 value:变乱的值,比方按键按下、松开或鼠标位置的厘革。


  • 代码逻辑的寄义

    • 通过调用 read(),从文件形貌符 ts->fd 中读取一个输入变乱的数据,并存储在 ev 布局体中。
    • 返回值 ret:

      • 假如 ret > 0:体现乐成读取了 ret 字节,通常应该即是 sizeof(struct input_event)。
      • 假如 ret == 0:体现文件已到达末端(对于某些装备文件,这种情况大概不会发生)。
      • 假如 ret == -1:体现发生错误,应查抄 errno 以获取错误缘故起因。


  • 应用场景

    • 这种代码通常出现在处理处罚 Linux 输入装备的步伐中,用于读取键盘、鼠标或其他输入装备的变乱。

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表