Linux环境编程:从应用到内核一书中提到atexit函数,在进程退出的时候,exit or return in main,会调用atexit注册的退出函数。
但是如果收到信号退出了,并不会调用注册的函数。
有没有办法让收到信号退出的时候,也调用注册的atexit函数?
当然了肯定是改那些可以捕捉到的信号,像SIGKILL 这种根本不给你机会捕捉的函数,你肯定是没啥办法的。
我今天正好遇到这种需求。我的测试程序是模拟视频监控的写入。因为视频监控会以一定的码率写入,400个摄像头,就意味着400路并发写入。
我会统计丢帧率。但是有时候会不得ctrl + C放弃本次模拟。但是我希望收到SIGINT之后,也能过打印出来这部分的结果,如何做到?
void sigint_handler(int signo)
{
exit(130);
}
struct sigaction new_action, old_action;
new_action.sa_handler = sigint_handler;
new_action.sa_flags = 0 ;
sigemptyset(&new_action.sa_mask);
sigaction(SIGINT,&new_action, &old_action);
atexit(print_result_and_exit);
..
就是说,信号处理函数中,调用exit,这时候,就会调用atexit,我们的目的也就达到了。
为什么exit(130), 130是什么?
约定,收到信号退出,retcode为 128 + signo,所以SIGINT返回130,告知接受者,我是收到了SIGINT信号退出的。
当然了这是末节,你随便写个其他返回值也没啥,但是出于规范,最好返回130.
希望作者书中可以提以下这个比较有意思的地方。