我在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,...);
}
答案 0 :(得分:1)
在这里您可以看到使用中断的系统调用。但是信号处理线程的便利性可能高于使用中断系统调用。
因此,您需要阻止客户端处理程序,直到它可以接受传入连接或发生信号。等待潜在输入意味着信号驱动IO - 我不会遵循的路径 - 或选择(2)(或池)。但select(2)只能等待IO。因此,转换IO中的信号发生:打开管道,让信号处理线程在SIGQUIT发生时写入管道,并让客户端线程选择(2)作为套接字和管道的另一端。
答案 1 :(得分:0)
只有一个线程接收针对进程的信号。因此,它必须不是accept()
上阻止的线程。有关详细信息,请参阅signal concepts。
如前所述,您可能应该使用基于select()
的事件循环。我建议使用libevent。
答案 2 :(得分:0)
无需中断阻止accept
通话。只要确保如果线程确实从accept
返回,例如通过接收实际连接,它就不会做任何有害的事情。
如果出于某种特定原因需要accept
来中断,请解释它是什么。可能有一种简单的方法可以消除这种要求。