Linux进程退出:SIGINT、SIGTERM 和 SIGKILL 有关信号 区别

背景

学习 海思SDK,查看例程的时候发现了类似下面的代码:

int main(int argc, char *argv[])
{ 
    if(argc != 2)
    {
        printf("Usage: mpeg <vedio source filename>
");
        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中);以避免因为资源回收不当而导致的一些问题。

原文地址:https://www.cnblogs.com/schips/p/12462965.html