当前位置: 首页 > 工具软件 > ngx-config > 使用案例 >

core/ngx_core剖析

郎成弘
2023-12-01

core/ngx_core剖析

头文件起手式

每一个头文件都必须具备头文件起手式,#ifndef、#define和#endif,这样做可以防止头文件被多次加载,最好头文件编辑一开始就这样,防止忘掉其中一部分,因为预编译是不带代码格式缩进的,所以在#endif这行中应该有注释来说明这个#endif的作用。

#ifndef _NGX_CORE_H_INCLUDED_
#define _NGX_CORE_H_INCLUDED_
...
#endif /* _NGX_CORE_H_INCLUDED_ */

操作系统版本差异性

因为操作系统版本之间存在的差异性,所以需要通过ngx_config.h,根据当前操作系统版本把操作系统的特性加载起来。ngx_config.h后续会有文章进行分析。

include <ngx_config.h>

声明数据结构

常用的Nginx中的数据结构,把结构类型进行语义化,可以像基本类型那样使用。

typedef struct ngx_module_s          ngx_module_t;
typedef struct ngx_conf_s            ngx_conf_t;
typedef struct ngx_cycle_s           ngx_cycle_t;
typedef struct ngx_pool_s            ngx_pool_t;
typedef struct ngx_chain_s           ngx_chain_t;
typedef struct ngx_log_s             ngx_log_t;
typedef struct ngx_open_file_s       ngx_open_file_t;
typedef struct ngx_command_s         ngx_command_t;
typedef struct ngx_file_s            ngx_file_t;
typedef struct ngx_event_s           ngx_event_t;
typedef struct ngx_event_aio_s       ngx_event_aio_t;
typedef struct ngx_connection_s      ngx_connection_t;
typedef struct ngx_thread_task_s     ngx_thread_task_t;
typedef struct ngx_ssl_s             ngx_ssl_t;
typedef struct ngx_ssl_connection_s  ngx_ssl_connection_t;
typedef struct ngx_udp_connection_s  ngx_udp_connection_t;

声明回调函数的类型

抽象出一个声明回调函数的类型的万能范式:

typedef 返回值类型 (*函数类型)(参数)

所以定义Nginx回调函数的类型可以这样做:

typedef void (*ngx_event_handler_pt)(ngx_event_t *ev);
typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);

定义状态码

#define  NGX_OK          0
#define  NGX_ERROR      -1
#define  NGX_AGAIN      -2
#define  NGX_BUSY       -3
#define  NGX_DONE       -4
#define  NGX_DECLINED   -5
#define  NGX_ABORT      -6

引用头文件

这里有个trick,如果要根据一些配置,选择头文件是否include进来,可以这样写

#if (Statement)
#include <xxx.h>
#endif

ngx_core中会根据NGX_PCRE来抉择是否include进来ngx_regex.h,根据NGX_OPENSSL来抉择是否include进来ngx_event_openssl.h

#include <ngx_errno.h>
#include <ngx_atomic.h>
#include <ngx_thread.h>
#include <ngx_rbtree.h>
#include <ngx_time.h>
#include <ngx_socket.h>
#include <ngx_string.h>
#include <ngx_files.h>
#include <ngx_shmem.h>
#include <ngx_process.h>
#include <ngx_user.h>
#include <ngx_dlopen.h>
#include <ngx_parse.h>
#include <ngx_parse_time.h>
#include <ngx_log.h>
#include <ngx_alloc.h>
#include <ngx_palloc.h>
#include <ngx_buf.h>
#include <ngx_queue.h>
#include <ngx_array.h>
#include <ngx_list.h>
#include <ngx_hash.h>
#include <ngx_file.h>
#include <ngx_crc.h>
#include <ngx_crc32.h>
#include <ngx_murmurhash.h>
#if (NGX_PCRE)
#include <ngx_regex.h>
#endif
#include <ngx_radix_tree.h>
#include <ngx_times.h>
#include <ngx_rwlock.h>
#include <ngx_shmtx.h>
#include <ngx_slab.h>
#include <ngx_inet.h>
#include <ngx_cycle.h>
#include <ngx_resolver.h>
#if (NGX_OPENSSL)
#include <ngx_event_openssl.h>
#endif
#include <ngx_process_cycle.h>
#include <ngx_conf_file.h>
#include <ngx_module.h>
#include <ngx_open_file_cache.h>
#include <ngx_os.h>
#include <ngx_connection.h>
#include <ngx_syslog.h>
#include <ngx_proxy_protocol.h>

回车符和换行符的重命名

代码中大篇幅的\n或者\r是不太好看的,那可以通过预编译去解决这个问题,让代码更美观

#define LF     (u_char) '\n'
#define CR     (u_char) '\r'
#define CRLF   "\r\n"

三个常用的运算

// 求绝对值
#define ngx_abs(value)       (((value) >= 0) ? (value) : - (value))
// 求最大值
#define ngx_max(val1, val2)  ((val1 < val2) ? (val2) : (val1))
// 求最小值
#define ngx_min(val1, val2)  ((val1 > val2) ? (val2) : (val1))

文件打开相关

//文件时如何处理符号链接的状态
/*
off
默认行为,允许路径中出现符号链接,不做检查。
on
如果文件路径中任何组成部分中含有符号链接,拒绝访问该文件。
if_not_owner
如果文件路径中任何组成部分中含有符号链接,且符号链接和链接目标的所有者不同,拒绝访问该文件。
*/
#define NGX_DISABLE_SYMLINKS_OFF        0 //
#define NGX_DISABLE_SYMLINKS_ON         1
#define NGX_DISABLE_SYMLINKS_NOTOWNER   2
 类似资料: