您的位置:首页 > 运维架构 > Linux

Linux基础----------文件 IO 之 read 和 write (readn 、writen、readline)

2016-07-31 14:21 405 查看
文章转载自:http://www.cnblogs.com/monicalee/p/3866410.html?utm_source=tuicool&utm_medium=referral

1. readn 和 writen

  1.1 基础巩固: read 和 write 函数的返回值

    1.1.1 read 函数原型为:ssize_t read(int fd, void* buf,
size_t count); (这里的 void *在标准 C 中表示通用指针即任意类型的指针都可以对它赋值,ssize_t 是有符号整数)它的返回值如下:

      a)成功返回读取的字节数,这里可能等于 count 或者小于 count (当 count > 文件 size 的时候,返回实际读到的字节数);

      b)刚开始读就遇到EOF 则返回 0;

      c)读取失败返回 -1, 并设置相应的 errno。

    1.1.2 write 函数的原型为:ssize_t write(int fd, const void *buf, size_t count); 它的返回值如下:

      a)成功返回写入的字节数,这里同上;

      b)写入失败返回 -1,并设置相应的 errno;

      c)当返回值为0 时,表示什么也没有写进去,这种情况在socket编程中出现可能是因为连接已关闭,在写磁盘文件的时候一般不会出现。

  1.2 为什么要封装一个readn 函数和
writen 函数,现有的read 函数和 write 含有有什么缺陷?


    这个是因为在调用read(或 write)函数的时候,读(写)一次的返回值可能不是我们想到读的字节数(即read函数中的 count 参数),这经常在读取管道,或者网络数去时出现。

  1.3 readn 函数 和 writen 函数

    1.3.1readn保证在没有遇到EOF的情况下,一定可以读取n个字节。它的返回值有三种:

      a) >0,表示成功读取的字节数,如果小于n,说明中间遇到了EOF;

      b)==0 表示一开始读取就遇到EOF;

      c) -1 表示错误(这里的errno绝对不是EINTR)。

    1.3.2 writen函数保证一定写满n个字节,返回值:

      a)n 表示写入成功n个字节

<!--[if !supportLists]--> b)-1 写入失败(这里也没有EINTR错误)

  1.3.3 源码如下,举例说明,当在while循环中调用readn(fd, buf, 20)去读取一个大小为55字节的文件时,会调用 4 次该readn函数

    a)第一次 返回 20;

    b)第二次 返回 20;

    c)第三次 返回 15(这里在readn函数内部会调用2次read函数,第一次只能读15字节,因为到EOF了,此时还差5字节,再读的的时候read直接返回0);

    d)第四次 返回 0 , 表示文件读完,跳出 while ,不会在进入 while 内部。

  

2. readline 函数

 2.1 readline函数:ssize_t readline(int fd, void *usrbuf, size_t maxlen),它的返回值:

    a)错误返回-1,不包括EINTR;

    b)取过程中碰到\n;

    c)没有碰到\n,而是读满maxlen-1个字节。

  

  

  

  2.3 readn、writen、readline属于同一个系列,称为网络编程三大函数。

3. RIO 一个用缓冲区实现的IO系统

3.1RIO中rio_read函数的编写思想:

    a)采用预读取方案,提前把数据读入Buffer;

    b)每当用户取数据的时候,从Buffer里面读取,而不是使用系统调用read函数,这样减少了多次使用系统调用的开销。

   3.2 rio_read函数的编写原则:必须与系统的 read 函数保持语义一致,这意味着rio_read的返回值有三种情况:

    a) -1代表出错,这里不包含EINTR;

    b) 0代表EOF,读取结束;

    c) >0表示读取的字节数。

  3.3 源码实现见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux