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

Unix 如何中断阻塞的accept()调用,unix,signals,Unix,Signals,我已经用C编写了一个多线程应用程序。我创建了两个线程,一个用于捕获所有信号,另一个用于接受客户端连接。当我使用killproc终止应用程序时,带有accept调用的线程不会中断。我怎样才能解决这个问题 代码如下所示: int stop_exec=0; sigCatcherThread() { int sig sigset_t allsignals; sigfillset(allsignals); do{ sigwait(&allsi

我已经用C编写了一个多线程应用程序。我创建了两个线程,一个用于捕获所有信号,另一个用于接受客户端连接。当我使用killproc终止应用程序时,带有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,...);
}

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


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

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


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

只有一个线程接收到针对进程的信号。因此,它必须不是accept上阻塞的线程。有关更多详细信息,请参阅


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

只有一个线程接收到针对进程的信号。因此,它必须不是accept上阻塞的线程。有关更多详细信息,请参阅


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

无需中断阻塞接受调用。只要确保线程确实从accept返回,比如通过接收实际连接,它不会做任何有害的事情


如果有特定的原因需要accept调用来中断,请解释它是什么。很可能有一种简单的方法可以删除该需求。

无需中断阻塞接受调用。只要确保线程确实从accept返回,比如通过接收实际连接,它不会做任何有害的事情


如果有特定的原因需要accept调用来中断,请解释它是什么。可能有一种简单的方法可以删除该要求。

使用自管道技巧,请参见[此处][1]。[1] 当前位置没有什么可修复的。如果出于某种原因需要该线程来获取信号,请解释它是什么,我们将告诉您如何修复它。使用自管道技巧,请参见[此处][1]。[1] 当前位置没有什么可修复的。如果有什么原因需要该线程来获取信号,请解释它是什么,我们将告诉您如何修复它。