我有一个用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, "%s\n", 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
,但程序没有退出。
我错过了我的sigaction代码吗?
答案 0 :(得分:4)
exit()
不一定是异步信号安全的。
直接从信号处理程序调用结束进程_exit()
或abort()
。
flock()
并且printf
系列函数的所有成员也不是异步信号保存。
有关异步信号安全功能的完整列表,您可能希望click here。
答案 1 :(得分:2)
我仍然怀疑您有一个XY问题,即在接收flock()
时试图取消SIGTERM
文件。
为了达到这个目的(并且通过此限制只能在信号接收上使用异步信号安全功能,请使用以下方法:
sigwaitinfo()
以接收和发送信号。答案 2 :(得分:1)
这很可能是因为你并不是真的被允许在信号处理程序中做很多事情(调用库函数肯定是粗略的)。
处理类似这样的事情的正常方法是让信号处理程序设置变量或排队正常主循环将处理然后退出的事件。