编译及执行步骤:

  • 1.接收进程编译 : g++ -g -o a.out signal.c
  • 2.运行接收进程:./a.out
  • 3.发送进程编译: g++ -o b.out signal.c
  • 4.发送进程查询接收进程pid:ps -alx | grep a.out | awk ‘{print $3}’
  • 5.发送进程发送信号:./b.out -s reload -p 36357(36357是第4部查询到的进程PID号)
    说明:nginx把主进程号写入文件中,在本例中手动查询下,当参数传入b.out进程

代码块

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
#include <unistd.h>
#define ngx_memzero(buf, n)       (void) memset(buf, 0, n)  //ngx_memzero使用的是memset原型,memset使用汇编进行编写
void
ngx_signal_handler(int signo)
{
printf("ngx_signal_handler :%d\n", signo);
}
typedef struct {int     signo;  //信号的编号char   *signame; //信号的字符串表现形式char   *name; //信号名称void  (*handler)(int signo); //信号处理函数
} ngx_signal_t;#define ngx_signal_helper(n)     SIG##n
#define ngx_signal_value(n)      ngx_signal_helper(n)#define ngx_random               random/* TODO: #ifndef */
#define NGX_SHUTDOWN_SIGNAL      QUIT
#define NGX_TERMINATE_SIGNAL     TERM
#define NGX_NOACCEPT_SIGNAL      WINCH
#define NGX_RECONFIGURE_SIGNAL   HUP#if (NGX_LINUXTHREADS)
#define NGX_REOPEN_SIGNAL        INFO
#define NGX_CHANGEBIN_SIGNAL     XCPU
#else
#define NGX_REOPEN_SIGNAL        USR1
#define NGX_CHANGEBIN_SIGNAL     USR2
#endif#define ngx_value_helper(n)   #n
#define ngx_value(n)          ngx_value_helper(n)ngx_signal_t  signals[] = {{ ngx_signal_value(NGX_RECONFIGURE_SIGNAL),"SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),"reload",ngx_signal_handler},{ ngx_signal_value(NGX_REOPEN_SIGNAL),"SIG" ngx_value(NGX_REOPEN_SIGNAL),"reopen",},{ ngx_signal_value(NGX_NOACCEPT_SIGNAL),"SIG" ngx_value(NGX_NOACCEPT_SIGNAL),"",ngx_signal_handler },{ ngx_signal_value(NGX_TERMINATE_SIGNAL),"SIG" ngx_value(NGX_TERMINATE_SIGNAL),"stop",ngx_signal_handler },{ ngx_signal_value(NGX_SHUTDOWN_SIGNAL),"SIG" ngx_value(NGX_SHUTDOWN_SIGNAL),"quit",ngx_signal_handler},{ ngx_signal_value(NGX_CHANGEBIN_SIGNAL),"SIG" ngx_value(NGX_CHANGEBIN_SIGNAL),"",ngx_signal_handler},{ SIGALRM, "SIGALRM", "", ngx_signal_handler },{ SIGINT, "SIGINT", "", ngx_signal_handler },{ SIGIO, "SIGIO", "", ngx_signal_handler },{ SIGCHLD, "SIGCHLD", "", ngx_signal_handler },{ SIGSYS, "SIGSYS, SIG_IGN", "", SIG_IGN },{ SIGPIPE, "SIGPIPE, SIG_IGN", "", SIG_IGN },{ 0, NULL, "", NULL }
};int ngx_os_signal_process(char *name, int pid)
{ngx_signal_t  *sig;for (sig = signals; sig->signo != 0; sig++) {if (strcmp(name, sig->name) == 0) {printf("send signame: %s\n", name);if (kill(pid, sig->signo) != -1) {return 0;}printf("ngx_os_signal_process");}}return 1;
}bool ngx_init_signals()
{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) {printf("sigaction(%s) failed", sig->signame);return false;}}return true;
}
unsigned int process;
static char *csignal;
int pid = 0;
int main(int argc, char *const *argv)
{u_char *p;int i;for (i = 1; i < argc; i++){p = (u_char*) argv[i];if(*p++ != '-'){printf("invalid option: - !\n");return -1;}while(*p){switch(*p++){case 's':case 'S':if(*p){csignal = (char*)p;printf("p csignal:%s\n", csignal);}else if(argv[++i]){csignal = argv[i];printf("argv csignal:%s\n", csignal);}else{printf("case s error!\n");return -1;}if(strcmp(csignal, "reload") == 0){printf("reload\n");continue;}else{printf("not reload\n");return -1;}break;case 'p':{pid = atoi(argv[++i]);}break;default:printf("default err!\n");return -1;}}}if(csignal){if(pid == 0){printf("pid : 0\n");return 0;}printf("pid: %d\n", pid);ngx_os_signal_process(csignal, pid);printf("run csignal!");return 0;}ngx_init_signals();while(1){printf("main\n");sleep(1);};
}

摘录nginx 信号处理方法部分代码相关推荐

  1. 基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)...

    综述 作者:aresmiki 链接:https://www.zhihu.com/question/23701194/answer/167005497 来源:知乎 著作权归作者所有.商业转载请联系作者获 ...

  2. php 判断是什么服务器,php判断服务器是apache还是nginx的方法

    帮别人调网站时,有时候需要知道网站是用的apache服务还是nginx服务,虽然说可以通过网页的head头来查看,但今天还是想说一下用php来检测服务器是用的apahce服务或nginx服务的方法. ...

  3. 【故障诊断】基于粒子群和多元宇宙算法优化最大相关峭度解卷积(MCKD)实现信号处理附matlab代码

    1 内容介绍 1.1研究背景及意义 制造业的发展支撑着国家经济的稳定快速发展,是人民生活幸福和国家局势 稳定的保障.发展制造业离不开科技创新.加强制造业创新.推动产业转型升级是 提升我国国际地位.实现 ...

  4. MATLAB不同时频信号处理方法介绍及效果对比

    本文欢迎非商业目的的学习分享转载,转载请附上原文链接及作者ID 本文为作者自身的一个学习总结,大部分内容在相关教材上也可以找到,有空的也会不定期更新.本身也在学习的过程中,出现错误在所难免,欢迎大家在 ...

  5. C语言-人狼羊菜问题-最容易看懂的解决方法及代码

    C语言-人狼羊菜问题-最容易看懂的解决方法及代码 参考文章: (1)C语言-人狼羊菜问题-最容易看懂的解决方法及代码 (2)https://www.cnblogs.com/zandbin/p/5341 ...

  6. docker下安装Nginx的方法

    这篇文章主要介绍了docker下安装Nginx的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 一. 环境说明 docker: 18.03.1-ce nginx: 1.15.1 二. 拉 ...

  7. java异常在哪一层捕获_当在一个方法的代码中抛出一个检测异常时,该异常或被方法中的 ( )结构 捕获,或者在方法的 ( ) 中声明_学小易找答案...

    [填空题]当异常已经被定义时,必须通过( ) 语句来处理它. [填空题]Catch 子句包含( )的程序段 [单选题]下列java语言的常用异常类中,属于检测异常的是() [单选题]自定义异常类时,可 ...

  8. 2021-04-09 随机模拟—蒙特卡洛方法 Matlab代码实现

    随机模拟-蒙特卡洛方法 Matlab代码实现 蒙特卡洛方法 蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出 ...

  9. 数据挖掘之3种数据归一化方法及代码实现

    学习数据挖掘.机器学习的同学们应该经常碰到数据归一化(也称标准化),数据的不同特征种类(评价指标)的取值范围差别可能很大,如果不做处理会影响数据分析的结果.因此需要把数据进行标准化处理,将数据进行比例 ...

最新文章

  1. 解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题
  2. android 蓝牙链接电脑,如何使从台式电脑到Android设备的测试蓝牙连接
  3. c语言编写单片机技巧
  4. tab切换webuploader失效的解决方法
  5. google android ui,UI Automator
  6. mysql备份和还原
  7. SQL按字段分组取最大(小)值记录(重复记录)
  8. c语言编写面向对象的类
  9. PTES 测试执行标准
  10. MatConvNet训练自己的网络
  11. 正态分布西格玛越大_6西格玛中正太分布包含什么?
  12. 典藏推荐:《乱世佳人》(《飘》)
  13. 手机版本android升级包下载,ColorOS8.0升级包下载安装-oppo手机系统ColorOS8.0正式版升级包下载 安卓版 v1.0- 游娱下载站...
  14. 9820E ClassicHome分析总结
  15. Sitecore学习总结(1)
  16. C语言学习6:数据类型 -> 基本类型 -> 整型类型(int、short int、long int、char等)
  17. java4android网易云,Android仿网易云音乐播放界面
  18. 360网站卫士SQL注入绕过案例一个
  19. GB2312(部分GBK)汉字编码表
  20. MySQL高级篇(高阳)建表sql语句大全

热门文章

  1. 谷歌发布:2021年度最受欢迎的开源Chrome插件!
  2. 每日一皮:多线程理想与现实的差距
  3. 会写代码是你创业路上的包袱吗?
  4. java int 127_Integer类型中奇怪的127和128
  5. 分数等级_志愿填报丨填报公办普通高中志愿,分数成绩和等级成绩均需关注
  6. 【mycat】读写分离
  7. Error: unsupported compiler: 9.3.0
  8. 目标检测优化2021
  9. python 编译exe
  10. graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tpdf', '-O', 'Digraph.gv']