1 定义 ngx_os_signal_process 函数 定义在 ./nginx-1.24.0/src/os/unix/ngx_process.cngx_int_t ngx_os_signal_process ( ngx_cycle_t * cycle, char * name, ngx_pid_t pid) { ngx_signal_t * sig; for ( sig= signals; sig-> signo!= 0 ; sig++ ) { if ( ngx_strcmp ( name, sig-> name) == 0 ) { if ( kill ( pid, sig-> signo) != - 1 ) { return 0 ; } ngx_log_error ( NGX_LOG_ALERT, cycle-> log, ngx_errno, "kill(%P, %d) failed" , pid, sig-> signo) ; } } return 1 ; } ngx_os_signal_process 函数的作用是: 根据传入的信号名称字符串,查找对应的操作系统信号编号, 并向指定 PID 的进程发送该信号, 用于实现 Nginx 运行时的控制指令2 详解 1 函数签名 ngx_int_t ngx_os_signal_process ( ngx_cycle_t * cycle, char * name, ngx_pid_t pid) 返回值 NGX_OK( 0):操作成功。 NGX_ERROR(-1):操作失败。参数 ngx_cycle_t *cycle 指向当前运行周期上下文环境 参数 char *name C 字符串指针,指向以 '\0' 结尾的字符数组 nginx -s 命令的参数 参数 ngx_pid_t pid 指定信号接收目标进程的id2 逻辑流程 1 局部变量 2 遍历查找信号 3 返回错误状态码1 局部变量{ ngx_signal_t * sig; 2 遍历查找信号for ( sig= signals; sig-> signo!= 0 ; sig++ ) { if ( ngx_strcmp ( name, sig-> name) == 0 ) { if ( kill ( pid, sig-> signo) != - 1 ) { return 0 ; } ngx_log_error ( NGX_LOG_ALERT, cycle-> log, ngx_errno, "kill(%P, %d) failed" , pid, sig-> signo) ; } } #1 循环,遍历 全局静态数组 signals, 该数组包含了 Nginx 能够主动发送给自身或其他进程的所有信号条目 ngx_signal_t 结构体中的 signo 字段是一个整数,代表操作系统定义的信号编号 哨兵设计: Nginx 在 signals 数组的末尾放置了一个 signo 字段为 0 的特殊元素作为终止标记。#2 比较传入的字符串参数 name 与当前信号表条目中的 sig->name 字段是否完全相等。 将用户友好的控制命令转换为操作系统信号。#3 系统调用 kill(pid, sig): 这是 POSIX 操作系统的标准 C 库函数(通常由内核提供的系统调用封装), 用于向进程 ID 为 pid 的进程发送信号 sig。 第一个参数 pid:目标进程的 PID,由函数外部传入。 第二个参数 sig->signo:当前匹配到的系统信号编号(例如 SIGHUP 的整数值)。#4 返回值检查逻辑: kill() 成功发送信号时返回 0,失败时返回 -1 并设置全局错误码 errno。 条件 != -1 意味着: 调用成功, 返回 0,表示函数执行成功 若失败 后面的记录错误日志才会被执行3 返回错误状态码return 1 ; }