“kill -15”触发sigaction代码但不终止我的C程序

时间:2013-06-06 15:38:06

标签: c linux signals kill

我有一个用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代码吗?

3 个答案:

答案 0 :(得分:4)

exit()不一定是异步信号安全的。

直接从信号处理程序调用结束进程_exit()abort()


flock()并且printf系列函数的所有成员也不是异步信号保存。


有关异步信号安全功能的完整列表,您可能希望click here

答案 1 :(得分:2)

我仍然怀疑您有一个XY问题,即在接收flock()时试图取消SIGTERM文件。

为了达到这个目的(并且通过此限制只能在信号接收上使用异步信号安全功能,请使用以下方法:

  • 屏蔽主线程中应用处理的所有信号。
  • 创建一个帖子。
  • 通过修改线程的信号掩码,使该线程接收所有要处理的信号。
  • 在此线程循环sigwaitinfo()以接收和发送信号。
  • 然后根据此线程收到的信号,做任何需要做的事情,没有任何限制,因为缺少任何功能的异步信号安全性。

答案 2 :(得分:1)

这很可能是因为你并不是真的被允许在信号处理程序中做很多事情(调用库函数肯定是粗略的)。

处理类似这样的事情的正常方法是让信号处理程序设置变量或排队正常主循环将处理然后退出的事件。