core/ngx_core剖析

core/ngx_core剖析

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>

回車符和換行符的重命名

代碼中大篇幅的
或者
是不太好看的,那可以通過預編譯去解決這個問題,讓代碼更美觀

#define LF (u_char)
#define CR (u_char)
#define CRLF "
"

三個常用的運算

// 求絕對值#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

推薦閱讀:

TAG:微軟Microsoft | 科技 | 計算機科學 |