我有一个用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用户定义的信号?
捕捉信号:使用成员函数作为信号处理程序
显示或redirect一个shell的作业控制消息
exit()不一定是异步信号安全的。
直接从信号处理程序调用_exit()或者abort()来结束进程。
flock()和printf族的所有成员都不是异步信号保存。
有关完整的异步信号安全功能列表, 请点击这里 。
我仍然怀疑你有一个XY问题,那就是在接收SIGTERM试图解开flock()一个文件。
为了达到这个目的(并且由此避开仅能够在信号接收上使用异步信号安全功能的限制,使用以下方法:
在主线程中屏蔽所有由应用程序处理的信号。
创建一个线程。
通过修改线程的信号掩码使该线程接收所有要处理的信号。
在这个围绕sigwaitinfo()线程循环中接收和发送信号。
然后根据这个线程接收到的信号,做任何需要做的工作,没有任何限制,因为缺少任何函数的异步信号安全性。
这很可能是因为你没有被允许在信号处理器中做任何事情(并且调用库函数肯定是粗略的)。
处理这种事情的正常方法是让信号处理程序设置一个变量或排队一个正常的主循环将处理然后退出的事件。
总结以上是内存溢出为你收集整理的“kill -15”会触发sigaction代码,但不会终止我的C程序全部内容,希望文章能够帮你解决“kill -15”会触发sigaction代码,但不会终止我的C程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)