世界太大,我无法安心学习,决定看一个简单的。
nginx-1.11.9的代码是nginx-0.5.38的两倍,决定看前者的。
阅读工具:UnderStand 3.1。
入口在nginx.c的195行。
第一点:ngx_cdecl
int ngx_cdecl main(int argc, char *const *argv)
#define ngx_cdecl
使用这个宏是为了跨平台支持,方便调整函数调用方式(__cdecl、__stdcall)
__cdecl:C Declaration的缩写,表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。
调用函数的代码和被调函数必须采用相同的函数的调用约定,程序才能正常运行。
__cdecl和__stdcall的区别:__cdecl是调用者清理参数占用的堆栈,__stdcall是被调函数清理参数占用的堆栈。假设函数A是__stdcall,函数B调用函数A。你必须通过函数声明告诉编译器,函数A是__stdcall。编译器自然会产生正确的调用代码。如果函数A是__stdcall,但在引用函数A的地方,你却告诉编译器,函数A是__cdecl方式,编译器产生__cdecl方式的代码,与函数A的调用约定不一致,就会发生错误。
注意事项:由于__stdcall的被调函数在编译时就必须知道传入参数的准确数目(被调函数要清理堆栈),所以不能支持变参数函数,例如printf。而且如果调用者使用了不正确的参数数目,会导致堆栈错误。
http://blog.csdn.net/leehong2005/article/details/8607536
http://blog.csdn.net/wuchunlai_2012/article/details/50686295
intptr_t不是指针类型,一个可以持有一个指针值的整型变量。
第二点:ngx_config.h 统一控制了跨平台的各类头文件的引入