当前位置:K88软件开发文章中心网站服务器框架nginx → 文章内容

Nginx 基本数据结构

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:28:43

temporary:1; /* * the buf's content is in a memory cache or in a read only memory * and must not be changed */ unsigned memory:1; /* the buf's content is mmap()ed and must not be changed */ unsigned mmap:1; unsigned recycled:1; unsigned in_file:1; unsigned flush:1; unsigned sync:1; unsigned last_buf:1; unsigned last_in_chain:1; unsigned last_shadow:1; unsigned temp_file:1; /* STUB */ int num; };pos:当 buf 所指向的数据在内存里的时候,pos 指向的是这段数据开始的位置。last:当 buf 所指向的数据在内存里的时候,last 指向的是这段数据结束的位置。file_pos:当 buf 所指向的数据是在文件里的时候,file_pos 指向的是这段数据的开始位置在文件中的偏移量。file_last:当 buf 所指向的数据是在文件里的时候,file_last 指向的是这段数据的结束位置在文件中的偏移量。start:当 buf 所指向的数据在内存里的时候,这一整块内存包含的内容可能被包含在多个 buf 中(比如在某段数据中间插入了其他的数据,这一块数据就需要被拆分开)。那么这些 buf 中的 start 和 end 都指向这一块内存的开始地址和结束地址。而 pos 和 last 指向本 buf 所实际包含的数据的开始和结尾。end:解释参见 start。tag:实际上是一个void *类型的指针,使用者可以关联任意的对象上去,只要对使用者有意义。file:当 buf 所包含的内容在文件中时,file字段指向对应的文件对象。shadow:当这个 buf 完整 copy 了另外一个 buf 的所有字段的时候,那么这两个 buf 指向的实际上是同一块内存,或者是同一个文件的同一部分,此时这两个 buf 的 shadow 字段都是指向对方的。那么对于这样的两个 buf,在释放的时候,就需要使用者特别小心,具体是由哪里释放,要提前考虑好,如果造成资源的多次释放,可能会造成程序崩溃!temporary:为 1 时表示该 buf 所包含的内容是在一个用户创建的内存块中,并且可以被在 filter 处理的过程中进行变更,而不会造成问题。memory:为 1 时表示该 buf 所包含的内容是在内存中,但是这些内容却不能被进行处理的 filter 进行变更。mmap:为 1 时表示该 buf 所包含的内容是在内存中, 是通过 mmap 使用内存映射从文件中映射到内存中的,这些内容却不能被进行处理的 filter 进行变更。recycled:可以回收的。也就是这个 buf 是可以被释放的。这个字段通常是配合 shadow 字段一起使用的,对于使用 ngx_create_temp_buf 函数创建的 buf,并且是另外一个 buf 的 shadow,那么可以使用这个字段来标示这个buf是可以被释放的。in_file:为 1 时表示该 buf 所包含的内容是在文件中。flush:遇到有 flush 字段被设置为 1 的 buf 的 chain,则该 chain 的数据即便不是最后结束的数据(last_buf被设置,标志所有要输出的内容都完了),也会进行输出,不会受 postpone_output 配置的限制,但是会受到发送速率等其他条件的限制。last_buf:数据被以多个 chain 传递给了过滤器,此字段为 1 表明这是最后一个 buf。last_in_chain:在当前的 chain 里面,此 buf 是最后一个。特别要注意的是 last_in_chain 的 buf 不一定是last_buf,但是 last_buf 的 buf 一定是 last_in_chain 的。这是因为数据会被以多个 chain 传递给某 个filter 模块。last_shadow:在创建一个 buf 的 shadow 的时候,通常将新创建的一个 buf 的 last_shadow 置为 1。 temp_file:由于受到内存使用的限制,有时候一些 buf 的内容需要被写到磁盘上的临时文件中去,那么这时,就设置此标志。对于此对象的创建,可以直接在某个 ngx_pool_t 上分配,然后根据需要,给对应的字段赋值。也可以使用定义好的 2 个宏: #define ngx_alloc_buf(pool) ngx_palloc(pool, sizeof(ngx_buf_t)) #define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t))这两个宏使用类似函数,也是不说自明的。对于创建 temporary 字段为 1 的 buf(就是其内容可以被后续的 filter 模块进行修改),可以直接使用函数 ngx_create_temp_buf 进行创建。 ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size);该函数创建一个 ngx_buf_t 类型的对象,并返回指向这个对象的指针,创建失败返回 NULL。对于创建的这个对象,它的 start 和 end 指向新分配内存开始和结束的地方。pos 和 last 都指向这块新分配内存的开始处,这样,后续的操作可以在这块新分配的内存上存入数据。pool: 分配该 buf 和 buf 使用的内存所使用的 pool。size: 该 buf 使用的内存的大小。为了配合对 ngx_buf_t 的使用,Nginx 定义了以下的宏方便操作。 #define ngx_buf_in_memory(b) (b->temporary || b->memory || b->mmap)返回这个 buf 里面的内容是否在内存里。 #define ngx_buf_in_memory_only(b) (ngx_buf_in_memory(b) && !b->in_file)返回这个 buf 里面的内容是否仅仅在内存里,并且没有在文件里。 #define ngx_buf_special(b) \ ((b->flush || b->last_buf || b->sync) \ && !ngx_buf_in_memory(b) && !b->in_file)返回该 buf 是否是一个特殊的 buf,只含有特殊的标志和没有包含真正的数据。 #define ngx_buf_sync_only(b) \ (b->sync \ && !ngx_buf_in_memory(b) && !b->in_file && !b->flush && !b->last_buf)返回该 buf 是否是一个只包含 sync 标志而不包含真正数据的特殊 buf。 #define ngx_buf_size(b) \ (ngx_buf_in_memory(b) ? (off_t) (b->last - b->pos): \ (b->file_last - b->file_pos))返回该 buf 所含数据的大小,不管

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页


Nginx 基本数据结构