我很抱歉这个问题的基本性,但我在这里遇到了问题。我有一个客户端 - 服务器程序。我不知道有多少连接会来,但它们不是无限的。最后,在所有连接关闭后,输出一些结果。但我遇到的问题是,接受连接是在无限循环中,如何停止输出结果。
由于
答案 0 :(得分:1)
你需要有某种形式的条件来摆脱你的循环,在你的情况下,超时可能会工作得最好,基本上意味着,如果你没有得到任何新客户x秒,你停止寻找客户端,同样适用于任何连接错误。
还需要查看您正在使用的代码。
答案 1 :(得分:1)
处理EINTR
来自accept(2)
的错误并终止该程序并点击^C
通常有效。
答案 2 :(得分:0)
您可以为SIGTERM
信号安装处理程序,该处理程序将设置全局volatile sig_atomic_t
变量,并在多路复用循环中测试该变量(可能在poll
或select
附近)。请记住,signal处理程序无法调用许多函数(只有 async-signal-safe )。
大多数Linux或Posix服务器都可以很好地捕获SIGTERM
。
您可以考虑使用libev
,libevent
等事件处理库。
答案 3 :(得分:0)
虽然我的背景是Windows NT,但“名称”功能是指在任何多线程环境中都应该可用的通用线程或处理函数。
如果主线程可以确定有问题的子线程何时应该终止它,可以通过让子线程循环在布尔值上来实现这一点 - 例如“terminate_conditon” - 或者通过它的句柄终止线程。
// child thread
terminate_condition=FALSE;
while (!terminate_condition)
{
// accept connections
}
child_thread_done=TRUE;
// output results
exit_thread ();
// main thread
child_thread_done=FALSE;
child_thread=create_thread (...);
// monitor connections to determine when done
terminate_condition=TRUE;
while (!child_thread_done)
{
sleep (1);
}
// or maybe output results here?
exit_process ();
这种受控终止解决方案要求只有一个线程写入child_thread_done布尔值,并且任何其他线程只读取。
或者
// child thread
while (1)
{
// accept connections
}
// main thread
child_thread=create_thread (...);
// monitor connections to determine when done
kill_thread (child_thread);
// output results
exit_process ();
第二种形式更加混乱,因为它只会杀死子线程。通常,最好让子线程执行受控终止,特别是如果它已经分配了资源(这将成为整个过程的责任,而不仅仅是分配线程)。
如果有许多子线程处理连接,则需要使用同步终止机制:具有与子线程一样多的成员的结构(终止线程将其“终止”布尔值设置为true,终止并且主线程监视器结构,以确保所有子“终止”布尔值在继续之前是真的)或包含操作子线程数的计数器(当一个孩子即将终止它时,通过螺旋锁独占控制计数器,减少它并释放它在终止之前锁定:主线程在计数器包含零之前没有做任何事情。)