pthread_cleanup_push处理程序不适用于SIGINT(Ctrl C)

时间:2014-01-30 07:24:55

标签: c linux pthreads

我的代码类似于:

myThread()
{
    pthread_cleanup_push(CleanupHandler , NULL)
    while (true)
    {
      /* some code here */
    }
    pthread_cleanup_pop(NULL)

 }

 static void CleanupHandler(void *arg)
 {
   printf("Cleaned\n");
 }

但是如果我使用^ C(SIGINT)终止我的应用程序,则清理处理程序不起作用。这是预期的吗?使CleanupHandler在^ C工作的解决方法是什么?

1 个答案:

答案 0 :(得分:4)

是的,这是预期的,根据手册页,pthread_cleanup_push()在以下3种情况下执行:

      1) When a thread is canceled
      2) thread terminates using pthread_exit()
      3) when pthread_cleanup_pop()

要解决您的问题,您可以为SIGINT注册一个信号处理程序,从该处理程序使用pthread_exit()pthread_cancel()来执行您的处理程序。希望这有帮助!