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中);以避免因为资源回收不当而导致的一些问题。

  • 相关阅读:
    【Python编程:从入门到实践】chapter6 字典
    【Python编程:从入门到实践】chapter5 if语句
    【Linux_Unix系统编程】Chapter9 进程凭证
    【Linux_Unix系统编程】Chapter10 时间
    【Linux_Unix系统编程】Chapter8 用户和组
    【Linux_Unix系统编程】chapter7 内存分配
    【Linux_Unix系统编程】chapter6 进程
    书籍 人生
    流程图软件
    技术文章,iOS,iOS开发系列 数学函数
  • 原文地址:https://www.cnblogs.com/schips/p/12462965.html
Copyright © 2011-2022 走看看