`

nginx 源码学习笔记(十三)——文件读写和配置文件读取

 
阅读更多

对于c语言来说,如果需要支持多个操作系统,就需要封装一下文件的读写。封装文件的读写还有一个益处就是能够把读写异常,读写的内存控制,日志的记录封装起来,以便于其他的模块更好的应用。文件的读写一般会封装成打开文件,关闭打开的文件,读写文件。

在nginx的源码中,文件读写主要放在core/ngx_file.c,core/ngx_file.h,src/os/unix/ngx_files.h和src/os/unix/ngx_files.c中。由于nginx的文件读写函数较多,我们只是详细介绍比较重要,经常使用,实现很有技巧的函数。


我们首先介绍简单封装的函数,再介绍复杂封装的函数,简单封装的函数有如下函数:
ngx_open_file/ngx_close_file


这里可以看到单纯的对c语言的open和close进行了封装,是不是非常简单呢?


ngx_delete_file删除文件函数,调用系统的unlink函数,unlink()会删除pathname指定的文件。如果该文件名最后连接点,但有其他进程打开了此文件,则在所有关于此文件的文件描述词皆关闭后才会删除。如果参数pathname为一符号连接(symboliclink),则此连接会被删除。

在ngx_files.c文件中存在大量的文件读写操作,这里就不一一讲解;

配置文件一般有三个作用:

根据配置文件启用某段程序,

用配置文件传入参数,

设定启动程序程序之间的相互关系。

Nginx的配置文件也实现了这三部分的功能,nginx的配置文件主要有以下几个主要的结构体和函数配置文件的结构体有:

结构体说明
ngx_command_s 定义了配置文件中的 tag的配置,以及遇到该tag该怎么处理的函数
ngx_open_file_s 定义了打开文件的参数的结构体
ngx_conf_file_t 定义了缓存配置文件的数据的结构体
ngx_conf_s 定义了配置文件解析过程中需要缓存的数据

ngx_command_s这个结构体定义了配置文件中的tag,以及遇到该tag,该怎么处理,其结构如下表:

结构体说明
name 配置文件中的
tag
Type
配置类型,这个参数中会定义这个配置是什么范围内的配置(核心配置或是普通配置),以及有多少参数, 是块配置,还是行配置
Set 解析该配置的函数
ConfOffset 指定配置存储的位置
Post 指向模块在读配置的时候需要的一些零碎变量。一般它是NULL

在每一个ngx_command_s数组的结尾必须有一个ngx_null_command,以用于判断是否结束。
配置文件解析的入口为ngx_conf_parse,如果了解了ngx_conf_parse,对nginx的配置文件的原理就有了基本的了解,下面我们详细的解释一下



ngx_conf_parse函数除了在ngx_init_cycle函数中调用外,在配置块的解析中,即cmd->set函数(例如解析http配置块的ngx_http_block函数)中也会调用该函数,从某种程度上理解该函数其实是一个递归函数,只不过中间调用了其他函数。在讲解http的配置文件那一章我们会根据http的配置例子详细的讲解。

分享到:
评论

相关推荐

    前端学习笔记-Node.js

    1. **读写文件**:掌握读取、写入、追加文件,以及文件路径处理技巧。 2. **目录操作**:了解创建、删除、遍历目录的方法。 3. **文件权限与同步异步操作**:理解文件系统的权限模式,以及同步和异步操作的区别和...

    Java项目学习笔记: SSM实战项目-Java高并发秒杀API,详细流程+学习笔记

    在本Java项目学习笔记中,我们关注的是SSM(Spring、SpringMVC、MyBatis)框架下的高并发秒杀API实现。这是一个典型的电商场景,其中涉及到的技术点广泛且实用,对于提升Java开发者处理高并发问题的能力至关重要。...

    jt13日常笔记

    在构建高性能的IT系统时,负载均衡、缓存机制、数据库主从复制和读写分离以及数据处理策略是至关重要的组成部分。以下是对这些知识点的详细解释: 1. **负载均衡**: - 使用Nginx作为负载均衡器,可以实现5万台...

    PHP从入门到精通学习记录完整笔记整理分享

    3. **文件操作**:PHP可以读写文件,`file_get_contents()`读取文件内容,`file_put_contents()`写入文件。还有`fopen()`, `fwrite()`, `fclose()`等用于文件处理。 4. **会话管理**:`session_start()`开启会话,`...

    stayfoo-hub:Go开发笔记,Go思维导图,一些开源库原始代码分析。

    Go语言在处理I/O操作时的效率和灵活性是其一大亮点,通过这部分学习,我们可以掌握如何高效地进行数据读取和写入,这对于构建服务器端应用或处理大量数据的应用尤其重要。 在标签中,我们看到了一系列与Go语言相关...

    Webinar-PHPInit:开发PHP

    `fopen`、`fwrite`和`fclose`用于文件读写,`file_exists`检查文件是否存在,`mkdir`创建目录,`unlink`删除文件。 7. **错误处理与调试**:在开发过程中,学会使用`error_reporting`设置错误报告级别,`try......

Global site tag (gtag.js) - Google Analytics