关于atexit函数

15 views
Skip to first unread message

Li Bin

unread,
Jul 1, 2017, 4:51:11 AM7/1/17
to 《linux环境编程》讨论组
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.

希望作者书中可以提以下这个比较有意思的地方。




Gao Feng

unread,
Jul 3, 2017, 12:53:09 AM7/3/17
to 《linux环境编程》讨论组
但是exit本身不是信号安全函数,不推荐在信号处理函数中调用。。。。

我建议,还是信号处理函数设置flag,main thread检查flag,然后exit
Reply all
Reply to author
Forward
0 new messages