Unix 如何中断阻塞的accept()调用
我已经用C编写了一个多线程应用程序。我创建了两个线程,一个用于捕获所有信号,另一个用于接受客户端连接。当我使用killproc终止应用程序时,带有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
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] 当前位置没有什么可修复的。如果有什么原因需要该线程来获取信号,请解释它是什么,我们将告诉您如何修复它。