Chinaunix首页 | 论坛 | 博客
  • 博客访问: 772088
  • 博文数量: 265
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1985
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-13 12:33
文章分类

全部博文(265)

文章存档

2011年(1)

2010年(66)

2009年(198)

我的朋友

分类: LINUX

2010-08-19 20:28:34

问:我写了一个后台程序,在系统重启时会做一些保存工作。因此用signal()对SIGTERM进行了处理。测试时让后台程序运行,用命令kill -15  PID,保存工作运行良好。但是实际测试,我用命令 reboot,后台进程却不能接收到SIGTERM信号,未进行保存工作。 
  同样都是发送SIGTERM信号给进程(kill和reboot),为什么处理不一样?请指点。

答:找到问题的原因了。其实不是信号的问题。 
    如果这个程序脱离任何终端,在后台运行,那么它能接收到SIGTERM信号,并按要求执行。但是我做测试的时候,它是在一个终端上运行程序的,属于此终端的一个子进程。在reboot命令的后,终端先关闭了,此进程随即结束,并未收到SIGTERM信号。 
    具体没查到资料,但是可以猜测几点:reboot命令后发送的SIGTERM信号是按PID从小到大发送的;当父进程接收到SIGTERM信号后,向子进程发送SIGKILL信号立即结束。

后来我用setsid()解决这个问题。代码类似: 

if(fork()>0) 

exit (0);

setsid(); 

可以脱离当前session。
阅读(5956) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~