头文件起手式
每一个头文件都必须具备头文件起手式,#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