apache中的文件与目录(2)[13]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

            thefile->direction = 1;
        }
 
        rv = 0;
        while (rv == 0 && size > 0) {
            if (thefile->bufpos == thefile->bufsize)   /* write buffer is full*/
                rv = apr_file_flush(thefile);                v
 
            blocksize = size > thefile->bufsize - thefile->bufpos ?
                        thefile->bufsize - thefile->bufpos : size;
            memcpy(thefile->buffer + thefile->bufpos, pos, blocksize);                     
            thefile->bufpos += blocksize;                  w
            pos += blocksize;
            size -= blocksize;
        }
 
        return rv;
    }
在分析文件缓冲写之前,我们先看一下实际的文件系统的读写情况。在文件系统内部始终维持一个内部位置指针,该指针随着当前读取和写入的位置的改变而不停的改变,同时任何一次读取和写入都是在内部指针指向的位置基础上进行的,因此如果在写之前,文件内部的指针偏移为offset,则写入的数据将插入到offset之后。
这种情况对于APR文件缓冲而言也必须实现同样的效果。不过,如果文件thefile在写之前刚被读过,则存在两个offset偏移位置:
1)、filePtr。任何时候,实际文件内部的指针用filePtr进行模拟指示,它始终与内部指针保持同步。
2)、bufpos。该位置指示用户实际已经读取的缓冲区位置,它在实际文件内部的偏移量为filePtr-(dataRead-bufpos)。
那么在写入时候,新的数据是插入到filePtr之后还是filePtr-(dataRead-bufpos)之后呢?答案只有一个:一切从用户的角度出发。对于最终用户而言,它能够观察到的现象是:数据刚被读取到bufpos位置,至于文件缓冲区的文件长度多少用户根本无法了解到。因此对于用户而言,文件的偏移量应该是filePtr-(dataRead-bufpos),而不是filePtr,即使实际的内部文件指针偏移量确实是filePtr。
因此如果filePtr和filePtr-(dataRead-bufpos)不一致的时候,必须调整文件内部的实际偏移指针为filePtr-(dataRead-bufpos),以保证正确的写入位置。另外必要的工作就是初始化写入缓冲区,这正是代码u所实现的任务。
一旦定位完毕,那么就可以进行数据写入了。用户缓冲区中所有的数据首先都立即写入到文件缓冲区中,写入的时候可能发生的情况包括下面几种:
1)、缓冲区已满。apr_file_t中缓冲区的大小由bufsize确定,默认大小为4K。一旦缓冲区已满,那么缓冲区中的数据将使用apr_file_flush一次性写入到实际的文件中,同时再次初始化缓冲区。Apr_file_flush函数的实现非常简单,顺便一看:
APR_DECLARE(apr_status_t) apr_file_flush(apr_file_t *thefile)
{
    if (thefile->buffered) {
        if (thefile->direction == 1 && thefile->bufpos) {
            apr_ssize_t written;
 
            do {
                written = write(thefile->filedes, thefile->buffer, thefile->bufpos);

本文关键:apache中的文件与目录(2)
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top