免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2300 | 回复: 8
打印 上一主题 下一主题

[函数] 关于signal的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-02 10:10 |只看该作者 |倒序浏览
我有一个程序abc在运行,有另外一个minitor在监测,如果发现abc死掉,则重新启动abc。
另外monitor也可能会主动把abc杀掉重新启动。monitor程序是别人写的,由于种种原因,我无法拿到源代码。

现在的问题是在2个客户那儿频繁发生abc被重启的现象,严重影响使用。在测试环境则从来没有发生过类似问题,其它的100多家客户也没有发生。如何判断是abc自己死掉还是被monitor杀死的?

abc是一个daemon,自己不会主动退出,除非收到了signal。

1、收到了什么signal?
可否把所有的信号都加上信号处理函数,打印出收到的信号,SIGKILL和SIGSTOP好像是不可捕获的,如何去处理呢?

2、signal是abc自己的原因产生还是外部程序发给它的?
这个应该如何去判断?

论坛徽章:
0
2 [报告]
发表于 2008-02-02 10:13 |只看该作者
“除非收到了signal”--难道就不可能是段错误之类的引起吗?

论坛徽章:
0
3 [报告]
发表于 2008-02-02 10:20 |只看该作者
man sigaction
关键字 SA_SIGINFO
action结构里的函数和我们平时的信号处理函数有点不一样

论坛徽章:
0
4 [报告]
发表于 2008-02-02 10:21 |只看该作者
哦,忘了,是linux吗?linux用户态可以知道所有的信息,比如谁发的,哪个进程

论坛徽章:
0
5 [报告]
发表于 2008-02-02 10:25 |只看该作者
原帖由 eagle518 于 2008-2-2 10:13 发表
“除非收到了signal”--难道就不可能是段错误之类的引起吗?

段错误也可以认为是收到了signal,比如SIGBUS,SIGSEGV, 也是可以捕获的。

论坛徽章:
0
6 [报告]
发表于 2008-02-02 10:26 |只看该作者
原帖由 flw2 于 2008-2-2 10:21 发表
哦,忘了,是linux吗?linux用户态可以知道所有的信息,比如谁发的,哪个进程

是FreeBSD 6.2

论坛徽章:
0
7 [报告]
发表于 2008-02-02 10:29 |只看该作者
那你看看手册吧,不知道它是不是也能得到更多的信息

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2008-02-02 11:50 |只看该作者
truss monitor

论坛徽章:
0
9 [报告]
发表于 2008-02-02 12:04 |只看该作者
原帖由 flw2 于 2008-2-2 10:29 发表
那你看看手册吧,不知道它是不是也能得到更多的信息

我实验了SA_SIGINFO, 但取到的si_pid一直是0,在网上查到好像是FreeBSD实现上的问题

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <signal.h>
  4. #include <stdio.h>

  5. static void sigaction_handler(int sig, siginfo_t *info,  void *ctx)
  6. {
  7.         printf("sig = %d, pid %d\n", sig, info->si_pid);
  8. }

  9. static void  signal_init()
  10. {
  11.         struct sigaction act;
  12.         act.sa_flags = SA_SIGINFO;
  13.         act.sa_sigaction = sigaction_handler;
  14.         sigaction(SIGHUP, &act, NULL);
  15. }

  16. int     main()
  17. {
  18.         printf("my pid: %d\n", getpid());
  19.         signal_init();
  20.         while (1) sleep(5);

  21.         return (0);
  22. }
复制代码


另外monitor不是C语言写的,具体是哪 个程序我都不清楚,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP