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