linux系统调用--READ

read是Linux系统中用于从打开的文件、管道或者终端中读取数据的系统调用。它将数据从文件描述符指向的文件中读取到缓冲区中。

函数原型

read函数的原型定义在unistd.h头文件中,如下所示:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符,指定从哪个打开的文件中读取数据。这个文件描述符是通过opensocketaccept等系统调用获得的。
  • buf:指向缓冲区的指针,用于存储从文件中读取的数据。
  • count:指定最大读取的字节数。

返回值

  • 当读取成功时,read返回实际读取到的字节数。
  • 如果到达文件末尾,则返回0
  • 出错时,返回-1,并设置errno以指示错误类型。

示例

下面是一个使用read函数从文件中读取数据的简单示例:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define TARGET_BYTES 1024  // 假设我们想要读取的目标字节数

int main() {
    int fd;
    ssize_t bytesRead, totalBytesRead = 0;
    char buffer[TARGET_BYTES];

    // 打开文件
    fd = open("/path/to/file.txt", O_RDONLY);
    if (fd == -1) {
        perror("Error opening file");
        return EXIT_FAILURE;
    }

    // 循环读取数据,直到读取到目标字节数或遇到文件末尾
    while (totalBytesRead < TARGET_BYTES) {
        bytesRead = read(fd, buffer + totalBytesRead, TARGET_BYTES - totalBytesRead);
        if (bytesRead == -1) {
            perror("Error reading file");
            close(fd);
            return EXIT_FAILURE;
        } else if (bytesRead == 0) {
            // 到达文件末尾
            break;
        }
        totalBytesRead += bytesRead;
    }

    printf("Total read %zd bytes.\n", totalBytesRead);

    // 处理读取到的数据


    // 关闭文件
    close(fd);
    return EXIT_SUCCESS;
}

在这个示例中,首先使用open函数以只读模式打开一个文件,并获得文件描述符fd。然后,使用read函数从该文件中读取最多sizeof(buffer) - 1字节的数据到buffer中。这里减1是为了在缓冲区末尾留出空间放置一个null字符,以确保可以将缓冲区内容作为字符串安全打印。读取操作后,检查read的返回值以确定操作是否成功。最后,打印读取的数据并关闭文件。

注意

  • 在使用read函数时,需要确保文件描述符指向的文件已经以适当的模式(如只读或读写)打开。
  • 读取操作可能会因为各种原因(如文件末尾、信号中断或资源暂时不可用)而读取的字节数少于请求的字节数。因此,可能需要根据返回的实际字节数和特定的应用逻辑来进行适当的处理。
  • 对于非阻塞的文件描述符,如果没有数据可读,read会立即返回-1,并且errno被设置为EAGAINEWOULDBLOCK
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值