世界太大,我无法安心学习,决定看一个简单的。

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 统一控制了跨平台的各类头文件的引入(下面是ngx_linux_config.h

#include <sys/types.h>  /** 基本系统数据类型32/64 **/
#include <sys/time.h> /** 日期时间头文件 **/
#include <unistd.h> /** POSIX系统调用如fork,pipe,IO原语read write close **/
#include <stdarg.h> /** 可变参数 **/
#include <stddef.h> /** offsetof() 获得字段在结构体中的偏移量 **/
#include <stdio.h> /** 标准IO **/
#include <stdlib.h> /** 五种类型、若干宏和工具类:随机、内存、数字转换 **/
#include <errno.h> /** 错误码字典 **/
#include <string.h> /** 字符串工具,strlen strcmp strcpy strncpy strcat strncat strchr strstr **/
#include <signal.h> /** 信号处理,signal raise **/
#include <pwd.h> /** 密码数据结构 **/
#include <grp.h> /** linux权限group概念 **/
#include <dirent.h> /** 目录操作 opendir readdir **/
#include <glob.h> /** glob返回指定模式匹配的路径数组 **/ #include <sys/uio.h> /** 原子操作下读取或写入多个缓冲区 **/
#include <sys/stat.h> /** 获取文件属性,如长度 fstat stat **/
#include <fcntl.h> /** fcntl改变文件性质 **/ #include <sys/wait.h> /** 停止进程执行,直到信号来wait waitpid **/
#include <sys/mman.h> /** 文件或对象映射到内存 mmap **/
#include <sys/resource.h> /** 进程优先级 get/setpriority **/
#include <sched.h> /** 内核进程task_struct,CPU亲和 CPU_ZERO、CPU_ISSET **/ #include <sys/socket.h> /** accept bind connect socket listen recv send... **/
#include <netinet/in.h> /** IPv4 in_addr 地址族 sockaddr_in **/
#include <netinet/tcp.h> /* TCP_NODELAY, TCP_CORK */
#include <arpa/inet.h> /** IP转换inet_pton,主机数转换ntohl ntohs htonl htons **/
#include <netdb.h> /** 网络有关 gethostbyaddr gethostbyname **/
#include <sys/un.h> /** UNIX Domain Socket: sockaddr_un **/ #include <time.h> /* 时区设置 tzset() */
#include <malloc.h> /* 分配较大内存 memalign() */
#include <limits.h> /* iovec的数组长度 IOV_MAX */
#include <sys/ioctl.h> /** 影响IO的flag **/
#include <sys/sysctl.h> /** 设置系统参数,文件系统、虚拟内存、网络 **/
#include <crypt.h> /** 加密 **/
#include <sys/utsname.h> /* 获取当前内核名称 uname() */ #include <ngx_auto_config.h> #if (NGX_HAVE_SYS_PRCTL_H)
#include <sys/prctl.h> /** 设置线程名字prctl(PR_SET_NAME, **/
#endif #if (NGX_HAVE_SENDFILE64)
#include <sys/sendfile.h> /** zero-copy **/
#else
extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);
#define NGX_SENDFILE_LIMIT 0x80000000
#endif #if (NGX_HAVE_POLL)
#include <poll.h> /** poll **/
#endif #if (NGX_HAVE_EPOLL)
#include <sys/epoll.h> /** epoll_create epoll_ctl epoll_wait **/
#endif

[nginx]第一篇的更多相关文章

  1. 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)

    Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...

  2. PHP 性能分析第一篇: Xhprof & Xhgui 介绍

    [前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 什么是性能分析? 性能分析是衡量应用程序在 ...

  3. 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇

    分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...

  4. lnmp架构(第一篇)

    lnmp 架构 第一篇 nginx 源码安装 nginx的安装包:nginx-1.12.0.tar.gz 建议安装前的修改: 在nginx的解压包中修改文件nginx-1.12.0/src/core/ ...

  5. CentOS7搭建FastDFS V5.11分布式文件系统-第一篇

    1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...

  6. PHP 性能分析第一篇: Intro to Xhprof & Xhgui

    [前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 原文链接如下: https://blog. ...

  7. LWJGL3的内存管理,第一篇,基础知识

    LWJGL3的内存管理,第一篇,基础知识 为了讨论LWJGL在内存分配方面的设计,我将会分为数篇随笔分开介绍,本篇将主要介绍一些大方向的问题和一些必备的知识. 何为"绑定(binding)& ...

  8. (第一篇)记一次python分布式web开发(利用docker)

    作者:落阳 日期:2020-12-23 在一次项目开发中,决定使用docker+nginx+flask+mysql的技术栈来开发,用此系列文章记录开发的过程. 系列文章,当前为第一篇,记录一次pyth ...

  9. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

随机推荐

  1. Spark Streaming概念学习系列之SparkStreaming运行原理

    SparkStreaming运行原理 Spark Streaming不断的从数据源获取数据(连续的数据流),并将这些数据按照周期划分为batch. Spark Streaming将每个batch的数据 ...

  2. struts2学习之基础笔记4

    拦截器 1.自定义拦截器类,必须继承AbstractInterceptor类(抽象类) 重写public String intercept (ActionInvocation arg0) 2.在Str ...

  3. Win7 disk.sys无法加载的问题

    Win7突然无法启动,应该说是启动中卡死,没有别的问题,用安全模式,显示加载disk.sys时卡死.搜索发现很多人遇到这个问题. 实际解决方法是查看数据线,重新插拔,换口,换线. 数据线出现故障往往表 ...

  4. java中常用的转义字符

    Day02_SHJavaTraing_4-3-2017 Java中允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量. 一.JAVA中常用的转义字符

  5. Declarative programming-声明式编程-布局约束是一个案例

    声明式编程需要底层或运行时环境支持. 声明式语言的关键词确定了执行的关键控制流. 表述编程语言是说明性的东西:而不是具体的执行方案. 通常他的执行由解释器进行. In computer science ...

  6. J2EE概念汇总

    JVM 是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟 ...

  7. Java基础之Colloction

    0 引言 以下是介绍Java有关集合类,以及对应每个类的用途,同时进行比较集合类的不同特点来让我们深入了解. 1 Collction接口 Collection是最基本的集合接口,一个Collectio ...

  8. vue自定义tap指令

    1.Vue指令 Vue提供自定义实现指令的功能, 和组件类似,可以是全局指令和局部指令,详细可以参见vue官网自定义指令一节(https://cn.vuejs.org/v2/guide/custom- ...

  9. [luogu] P3745 [六省联考2017]期末考试 (贪心)

    P3745 [六省联考2017]期末考试 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布. 第 \(i\) 位同学希望在第 \(t_i ...

  10. [luogu] P2354 [NOI2014]随机数生成器 (贪心)

    Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...