免费注册 查看新帖 |

Chinaunix

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

[内核模块] KERNEL中怎么能记录进程之间的SIGKILL信号发送 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-10 13:58 |只看该作者 |倒序浏览
APUE中说了SIGKILL是不能被捕捉,,,但是怎么能知道、记录进程之间的SIGKILL信号发送情况?

现在遇到的问题是,自己写的程序貌似被其他程序用SIGKILL干掉了,但是不知道是哪个进程KILL掉的?

KERNEL中有什么LOG或者/proc/系统什么位置可以记录SIGKILL的处理情况?比如我们可以用crontab 记录task的sigmask位来检查是什么信号导致进程退出?


谢谢。

论坛徽章:
0
2 [报告]
发表于 2012-07-10 16:25 |只看该作者
你可以试试在自己的程序中忽略发送的信号吧

论坛徽章:
0
3 [报告]
发表于 2012-07-10 17:54 |只看该作者
用ptrace()试试看,比如:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/ptrace.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <unistd.h>
  7. #include <sys/reg.h>   /* For user_regs_struct
  8.                              etc. */
  9. #include <bits/siginfo.h>
  10. int main(int argc, char *argv[])
  11. {   
  12.     pid_t traced_process;
  13.     siginfo_t test;
  14.     long ins;
  15.     if(argc != 2) {
  16.         printf("Usage: %s <pid to be traced>\n",
  17.                argv[0], argv[1]);
  18.         exit(1);
  19.     }   
  20.     traced_process = atoi(argv[1]);

  21.     if (ptrace(PTRACE_ATTACH, traced_process, NULL, NULL) == -1)
  22.     {   
  23.         perror("ATTACH:");
  24.         return 0;
  25.     }   
  26.    while (1)
  27.    {   
  28.         wait(NULL);

  29.         if (ptrace(PTRACE_GETSIGINFO, traced_process, NULL, &test) == -1)
  30.         {   
  31.                 perror("GETSIGINFO:");
  32.                 break;
  33.         }   

  34.         if (test.si_pid)
  35.         {   
  36.             break;
  37.         }   
  38.         else
  39.         {   
  40.             if (ptrace(PTRACE_CONT, traced_process, NULL, NULL) == -1)
  41.             {   
  42.                 perror("CONT:");
  43.                 break;
  44.             }   
  45.         }   
  46.     }   

  47.     printf("sid:%ld, uid:%ld, si_status:%x\n", test.si_pid, test.si_uid, test.si_status);
  48.     ptrace(PTRACE_KILL, traced_process, NULL, NULL);
  49.     ptrace(PTRACE_DETACH, traced_process, NULL, NULL);

  50.     return 0;
  51. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-07-11 11:14 |只看该作者
wenlujon 发表于 2012-07-10 17:54
用ptrace()试试看,比如:


谢谢你的例子代码,有两个问题:
1)PTRACE_GETSIGINFO 在我的linux系统上没有定义:
Linux 2.6.9-100.ELsmp #1 SMP  x86_64 x86_64 x86_64 GNU/Linux

我在代码中强制定义了: #define PTRACE_GETSIGINFO    0x4202
结果能编译运行,发现问题2)

2)我手动kill一个目标程序,该程序用你提供的ptrace代码(watch.out)跟踪。kill目标程序之后:
[root@aaa ]# ./watch.out 13924
trace process is 13924
GETSIGINFO:: No such process
sid:0, uid:0, si_status:7159a8
[1]+  Killed                  ./a.out

是不是GETSIGINFO只能用到arm之类的非x86系统上?

论坛徽章:
0
5 [报告]
发表于 2012-07-11 14:16 |只看该作者
从这个提示信息来看,你的目标程序的PID不是13924.
GETSIGINFO应该是先支持x86系统的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP