Linux read

Linux中的read函数

read函数时Linux中最基础的文件读取函数, 但是Linux中的文件包括 socket/普通文件/管道等等

函数原型

ssize_t read(int fd, void *buf, size_t len);
buf时读取后存入的地方, len指明buf的长度(最长读取的不会超过这个)

read的返回值

  • 1 返回一个小于len的正整数, 属于正常(如果可用字节数,小于len, 被信号打断)
  • 2 如果到达文件末尾, 返回0(对于普通文件) EOF
  • 3 如果对于socket之类的, 当没有内容时, 会一直阻塞
  • 4 返回-1, 说明出现了错误, 但是如果时EINTR, 表示被信号打断, 可以继续执行
  • 5 返回-1, errno为EAGAIN, 非阻塞模式下, 没有内容可读
  • 6 返回-1, errno为其他值, 说明的确出现了问题, 读出出错

文件描述符设置非阻塞

int fd_set_noblock(int fd)
{
    if(fd < 0)
    {
        return -1;
    }
    int flags = fcntl(fd, F_GETFL, 0);
    if(-1 == flags)
    {
        return -1;
    }
    
    int ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);   
    
    return ret;
}

先获取原有的属性, 然后加上非阻塞标志, 最后设进去

你可能感兴趣的:(Linux read)