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