最近在学习网络编程的知识,所以准备实现一个http服务器,写博客来记录一下学习的过程
RIO
RIO是csapp中提到的一个健壮的I/O包,为什么要使用这个来进行文件的读写,是因为接下来的socket编程中不适合使用c标准I/O
先贴出Rio包的实现
1 |
|
rio_readn函数和rio_writen函数和linux底层的read和write函数很像,不过处理了EINTR的错误,当read和write在阻塞时被某个信号中断,这时没有字节被读取/写入,系统会将错误代码置为EINTR
显然这个错误是可以修复的,当产生这个错误时我们只需要继续调用read和write即可
1 |
|
缓冲区是为了优化I/O速度,因为底层I/O要切换到内核态进行,切换过程开销很大
rio_t就是缓冲区的结构,rio_readinitb是将缓冲区与打开的文件关联上
rio_readnb函数就是read的带缓冲区版本
rio_readlineb是一次读取一行,这两个函数的核心是rio_read函数
rio_read函数是来维护缓冲区的,当缓冲区为空时它会将缓冲区填满,如果剩余未读取数据不够将缓冲区填满返回填入的字节数,只要缓冲区不为空就将指定的n与缓冲区剩余字节中小的那个值的字节数拷贝给用户缓冲区
1 | ... |
RIO同时是线程安全的,因为它给每一个文件配置了一个缓冲区,当不同线程读取不同文件的时候是线程安全的,当然当不同线程读取同一个文件还是会出问题,这就要用锁机制了
代码会同步更新再github