Linux signal预处理(ctrl c/kill)
2020-09-27 本文已影响0人
Openwit
最近在开发linux下的一个项目,遇到一个alsa资源占用问题,不知道如何解决。
当程序异常终止时,由于没有正确close相关handler,导致程序再次启动时snd_pcm_readi或者snd_pcm_writei返回io error(-5)错误。
因为上层UI使用QT开发,正常情况通过进程通信关闭声卡模块,但是强制关闭声卡模块的代码采用了killall方式,难免会造成上述问题。
想来想去,加入signal处理来尽量规避这一问题。解决方案如下:
1.引入signal.h
#include <signal.h>
2.实现sighandler
void sig_handler(int sig) {
if(sig == SIGINT || sig == SIGABRT || sig == SIGTERM) {
//调用snd_pcm_close 释放snd_pcm_open的handler
}
}
ctrl c会发送SIGINT;killall默认发送SIGTERM。
3.信号监听
int main(void) {
...
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
signal(SIGABRT, sig_handler);
while(1) {
...
}
}
注意:如果是多线程程序,按需在相关线程监听信号并处理。
补充:
查看系统所有信号:
kill -l