• 通过read()读文件


    一、在POSIX中的定义

    #include <unistd.h>
    
    ssize_t read(int fd, void *buf, size_t len);

    二、调用read()的可能结果

      2.1 返回值为len;读取到的所有len个字节都被存储在buf中,结果和预期的一致;

      2.2 返回值小于len大于0;读取到的字节被存储到buf中,原因:

       (1)在读取过程中信号中断或在读取中出错;

       (2)可读的数据大于0字节小于len字节在读取len字节之前到达EOF

      2.3 返回0,表示EOF,没有更多的数据可读;

      2.4 由于当前没有数据可用,调用阻塞;在非阻塞模式下,不会发生这种情况;

      2.5 返回-1,并把errno置为EINTR,这表示在读取任何字节之前收到信号;调用可以重新执行;

      2.6 返回-1,并把errno置为非EINTR或EAGAIN的一个值,这表示更严重的错误,重新执行读操作不会成功

    三、读入所有字节

    ssize_t ret;
    while (len != 0 && (ret = read(fd, buf, len)) != 0) { if (ret == -1) { if (errno == EINTR) { continue; } perror("read"); break; } len -= ret; buf += ret; }

    四、非阻塞读

      文件描述符以非阻塞模式打开(即open调用中指定参数O_NONBLOCK),并且没有数据可读,read调用会返回-1,并设置

      errno值为EAGAIN,而不是阻塞;当以非阻塞模式读文件时,必须检查EAGAIN,否则可能因为丢失数据导致严重错误 

    char buf[BUFSIZ];
    ssize_t nr;
    
    start:
    nr = read(fd, buf, BUFSIZ);
    if (nr == -1) {
        if (errno == EINTR) {
            goto start;      
        } 
        if (errno == EAGIN) {
             // 稍后重新读取   
        } else {
             // 发生错误
        }  
    }

          

  • 相关阅读:
    PHPStorm下XDebug配置
    HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)
    VC++深入详解-第五章学习心得
    nginx access log logrotate配置
    判断变量是否存在(python)
    一步一步学android之布局管理器——LinearLayout
    向前辈致敬 strspn
    poj 1087 (最大流)
    cocos2d-x Touch 事件应用的一个例子
    [置顶] C#扩展方法 扩你所需
  • 原文地址:https://www.cnblogs.com/soldierback/p/10667799.html
走看看 - 开发者的网上家园