zoukankan      html  css  js  c++  java
  • 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中);以避免因为资源回收不当而导致的一些问题。

  • 相关阅读:
    模板template用法
    关联式容器MAP的用法----类似与python中的dict
    迭代器iterator
    c++中的vertor
    Git操作(git reset & get revert)
    代码度量标准
    __attribute__关键字
    Centos7.2部署.Net Core2.0 WebApi
    通过nginx 访问 centos 7 服务器上的.Net Core
    ASP.NET Core部署到CentOS7,使用Nginx代理
  • 原文地址:https://www.cnblogs.com/schips/p/12462965.html
Copyright © 2011-2022 走看看