Nginx源码学习——进程通信

本文详细介绍了Nginx服务器在Master-Worker模型下的通信机制,包括通过Linux信号进行系统与Nginx之间的通信,Master与Worker进程间的Channel通信,以及Worker进程间通过共享内存的通信方式。重点讨论了信号的定义与注册、Channel的创建与使用,以及共享内存的分配与管理。
摘要由CSDN通过智能技术生成

    Nginx服务器在使用Master-Worker模型时,会涉及到三类通信:Linux系统与Nginx通信,Master进程与Worker进程通信,Worker进程间通信,也采用了三种不同的通信机制。


Linux信号

    Linux 系统与Nginx是通过信号进行通信的,例如在Linux命令行敲下 ./nginx -s stop ,实际系统会新开一个Master进程,该进程负责向原Master发送信号,发送完信号该进程就挂了,原Master进程接收到信号后执行相应的操作。

1.信号定义与注册

Nginx定义了一个ngx_signal_t结构体用于描述接收到信号的行为

typedef struct { //signals
    int     signo;   //需要处理的信号
    char   *signame; //信号对应的字符串名称
    char   *name;    //这个信号对应着的Nginx命令
    void  (*handler)(int signo); //收到signo信号后就会回调handler方法
} ngx_signal_t;

Nginx在启动时会调用ngx_init_signals函数,该函数通过sigaction系统调用初始化所有信号,并注册相应的信号处理函数。完成所有初始化工作后,Master进程调用ngx_master_process_cycle函数进入自身事件循环,负责监听信号,一旦收到信号后,执行对应信号处理函数。

ngx_int_t ngx_init_signals(ngx_log_t *log)
{
    ngx_signal_t      *sig;
    struct sigaction   sa;

    for (sig = signals; sig->signo != 0; sig++) {
        ngx_memzero(&sa, sizeof(struct sigaction));
        sa.sa_handler = sig->handler;
        sigemptyset(&sa.sa_mask);
        if (sigaction(sig->signo, &sa, NULL) == -1) {
#if (NGX_VALGRIND)
            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
                          "sigaction(%s) failed, ignored", sig->signame);
#else
            ngx_log_erro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值