关于SIGTERM信号问 我写了一个后台程序 在系统重启时会做一些保存工作 因此用 signal 对 SIGTERM 进行了处理 测试时让后台程序运行 用命令 kill nbsp 15 nbsp nbsp PID 保存工作运行良好 但是实际测试 我用命令 nbsp reboot 后台进程却不能接收到 SIGTERM 信号 未进行保存工作 nbsp nbsp nbsp 同样都是发送 SIGTERM 信号给进程 kill 和 reboot 为什么处理不一样 请指点 答 找到
问:我写了一个后台程序,在系统重启时会做一些保存工作。因此用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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224499.html原文链接:https://javaforall.net