IO学习--源码调试fwrite函数
前置知识:
这个fwrite函数中的_IO_write_ptr指针的挪动和fread函数中的_IO_read_ptr指针的挪动是不太一样的。先回顾一下上一篇文章中_IO_read_ptr指针什么时候挪动?当系统调用read的时候从文件中读取多少个字节的数据到输入缓冲区,就将_IO_read_end指针挪动多少个字节 初始值和_IO_read_base是一样的 ,而此时的_IO_read_ptr指针不动。当执行memcpy函数将数据从输入缓冲区拷贝多少个字节的数据到我们指定的内存地址,就将_IO_read_ptr指针挪动多少个字节。在_IO_read_base和_IO_read_ptr之间是已经拷贝过的数据,_IO_read_ptr和_IO_read_end之间是输入缓冲区中还未拷贝的数据。
而本次分析的fwrite函数则是直接将_IO_buf_end的值赋给了_IO_write_end(read的那个指针可不是这样),而_IO_write_ptr的初始值则和_IO_write_base的值一样。该函数先从指定的内存地址读取一定字节的数据到输出缓冲区,此时的_IO_write_ptr指针挪动(我这里以及上下文提到的挪动指的都是在原本的基础上加)相应的字节。此时的_IO_write_base指针和_IO_write_ptr指针之间的区域是将要从输出缓冲区写入文件的数据,而_IO_write_ptr指针和_IO_write_end指针之间的区域是输出缓冲区的可用区域(就是还能再往输出缓冲区拷贝多少个字节的内容),当执行系统调用write往文件中写入一定的字节的内容后,_IO_write_ptr就会减去相应的字节。
上面的内容一定要清楚,不然分析的时候就会陷入误区
前面两篇文章的地址如下: