CSAPP[10]系统级I/O

1.ssize_t和size_t的区别

  • 在x85_64系统中,size_t被定义为unsigned long,而ssize_t被定义为long。

2.用RIO包健壮地读写

RIO提供了两类不同的函数:
  • 无缓冲的输入输出函数。 这些函数直接在内存和文件之间传送数据。
  • 带缓冲的输入函数。 这些函数运行高效地从文件中读取文本行和二进制数据,并将这些内容缓存在应用级缓冲区内。带缓冲的RIO输入函数是线程安全的,它在同一个描述符上被交错地调用,例如从一个描述符中交替地读取一些文本行和二进制数据。
2.1 RIO的无缓冲的输入输出函数
ssize_t rio_readn(int fd, void *usrbuf, size_t n);
ssize_t rio_writen(int fd, void *usrbuf, size_t n);
  • rio_readn函数从描述符fd的当前文件位置最多传送n个字节到内存位置usrbuf。
2.2 RIO的带缓冲的输入函数
void rio_readinitb(rio_t *rp, int fd);
ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n);
  • 不好的做法:用read函数一次一个字节地从文件传送到用户内存,检查每个字节来找换行符,缺点是效率不高,每次调用都要求陷入内核。
  • 好的做法:调用包装函数(rio_readlineb),它从一个内部缓冲区复制一个文本行,当缓冲区变空时,会自动地调用read重新填满缓冲区。

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113921711