Linux进程退出:SIGINT、SIGTERM 和 SIGKILL 有关信号 区别
背景
学习 海思SDK,查看例程的时候发现了类似下面的代码:
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Usage: mpeg <vedio source filename>\n");
exit(0);
}
signal(SIGINT, SAMPLE_VDEC_HandleSig);
signal(SIGTERM, SAMPLE_VDEC_HandleSig);
SAMPLE_VDEC_VdhMpeg4(argv[1]);
return 0;
}
了解了有关资料,恍然大悟。觉得这种规范很好,当是新的学习机会,应该记录下来。
知识
signal 函数
我们查看有关的原型。(当时了解 typedef 的时候也是拿这个函数举例的)
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
这个函数的意义是:当收到 信号值为signum的信号时,执行handler函数。(注意,并非所有的信号值都可以这样处理)
1)SIGINT关联ctrl+c、只能结束前台进程
通过ctrl+c对当前进程发送结束信号,信号被进程树接收到(即:不仅当前进程,子进程也会收到结束信号)
2)SIGTERM可以被阻塞、处理和忽略;因此有的进程不能按预期的结束
kill不使用参数:发送SIGTERM信号,只有当前进程收到信号,若当前进程被kill,则子进程的父进程就会更改为init,即pid为1
kill命令的默认不带参数发生的信号就是SIGTERM,让程序友好退出 ,当程序未退出时,可以使用kill -9强制退出
设计思想
在程序启动的时候,注册了signal 函数,用来防止当进程意外退出时,能够及时进行有关资源的回收(尤其是在IPC中);以避免因为资源回收不当而导致的一些问题。
如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步