如何中断阻塞的accept()调用

时间:2011-11-07 15:04:37

标签: unix signals

我在C中编写了一个多线程应用程序。我创建了两个线程,一个用于捕获所有信号,另一个用于accept()客户端连接。当我使用killproc终止appilcation时,accept调用的线程不会被中断。我该如何解决这个问题?

代码如下:

int stop_exec=0;

sigCatcherThread()
{
    int sig
    sigset_t allsignals;
    sigfillset(allsignals);

    do{
          sigwait(&allsignals, &sig);
          if(sig==SIGTERM)
            stop_exec=1;
    }while(!stop_exec)

}

clientHandler()
{
  ...
  while(!stop_exec)
  {
      accept(...);
  }

main()
{
   pthread_create(..., sigCatcherThread,..);
   pthread_create(..., clientHandler,...);
}

3 个答案:

答案 0 :(得分:1)

在这里您可以看到使用中断的系统调用。但是信号处理线程的便利性可能高于使用中断系统调用。

因此,您需要阻止客户端处理程序,直到它可以接受传入连接或发生信号。等待潜在输入意味着信号驱动IO - 我不会遵循的路径 - 或选择(2)(或池)。但select(2)只能等待IO。因此,转换IO中的信号发生:打开管道,让信号处理线程在SIGQUIT发生时写入管道,并让客户端线程选择(2)作为套接字和管道的另一端。

答案 1 :(得分:0)

只有一个线程接收针对进程的信号。因此,它必须不是accept()上阻止的线程。有关详细信息,请参阅signal concepts

如前所述,您可能应该使用基于select()的事件循环。我建议使用libevent

答案 2 :(得分:0)

无需中断阻止accept通话。只要确保如果线程确实从accept返回,例如通过接收实际连接,它就不会做任何有害的事情。

如果出于某种特定原因需要accept来中断,请解释它是什么。可能有一种简单的方法可以消除这种要求。