我有一个用C开发的程序。我在程序中添加了一个sigaction处理程序,在退出程序之前执行一些C代码:
void signal_term_handler(int sig) { printf("EXIT :TERM signal Received!n"); int rc = flock(pid_file,LOCK_UN | LOCK_NB); if(rc) { char *piderr = "PID file unlock Failed!"; fprintf(stderr,"%sn",piderr); printf(piderr); } exit(EXIT_SUCCESS); } int main(int argc,char **argv) { struct sigaction sigint_action; sigint_action.sa_handler = &signal_term_handler; sigemptyset(&sigint_action.sa_mask); sigint_action.sa_flags = SA_RESETHAND; sigaction(SIGTERM,&sigint_action,NULL); ........... }
注意:我的程序包含2个正在运行的子线程
当我执行myprogram,然后我打电话kill -15 <pidnumber>杀死我的程序。 打印在标准输出中的信息是"EXIT :TERM signal Received!n ”,但程序没有退出。
我是否缺less我的sigaction代码?
从外部禁用Linux程序的信号
sigaction信号处理程序中的分段错误
如何处理在Windows上Perl的exception程序终止
如何在处理信号时阻止相同的信号?
Linux中POSIX可靠信号和POSIX实时信号有什么区别?
信号处理器为什么在处理相同的信号时被阻塞
有没有办法在Linux中创build用户定义的信号?
捕捉信号:使用成员函数作为信号处理程序
exit()不一定是异步信号安全的。
直接从信号处理程序调用_exit()或者abort()来结束进程。
flock()和printf族的所有成员都不是异步信号保存。
有关完整的异步信号安全功能列表, 请点击这里 。
我仍然怀疑你有一个XY问题,那就是在接收SIGTERM试图解开flock()一个文件。
为了达到这个目的(并且由此避开仅能够在信号接收上使用异步信号安全功能的限制,使用以下方法:
在主线程中屏蔽所有由应用程序处理的信号。
创建一个线程。
通过修改线程的信号掩码使该线程接收所有要处理的信号。
在这个围绕sigwaitinfo()线程循环中接收和发送信号。
然后根据这个线程接收到的信号,做任何需要做的工作,没有任何限制,因为缺少任何函数的异步信号安全性。
这很可能是因为你没有被允许在信号处理器中做任何事情(并且调用库函数肯定是粗略的)。
处理这种事情的正常方法是让信号处理程序设置一个变量或排队一个正常的主循环将处理然后退出的事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。