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中);以避免因為資源回收不當而導致的一些問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM