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 源码实现见。
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文件IO-open,write,read,lseek,close
- Linux 文件IO — open、read、write 、lseek
- Python基础-IO编程-读文件read-写文件write
- Linux系统开发 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()
- linux 2.6.11内核文件IO的系统调用实现分析(read,write)(转载)
- Linux基础编程-文件操作open,lseek,read,write,close
- Linux基础编程-文件操作open,lseek,read,write,close
- Linux-文件操作(open、write、read、close、iotcl)
- Linux基础编程-文件操作open,lseek,read,write,close
- linux 下文件I/O编程 (open、read、write、lseek、close)
- unix/Linux 低级IO函数的用法read && write
- 1.Linux应用编程---文件I/O(open、read、write、lseek、close)
- Java基础之读文件——使用通道随机读写文件(RandomReadWrite)
- 【Linux】使用read、write、lseek函数实现文件读写操作
- [转]Linux文件操作函数open close read write等示例
- linux基础之 c语言编程中 write 和 read 注意
- linux下文件的读写操作(openreadwrite)
- sys_read()/vfs_read()/vfs_write() Linux VFS文件系统之读写(read/write)文件
- linux系统编程之文件与IO(二):系统调用read和write
- 文件IO(2)--read、write和lseek