暂停客户端服务器程序

时间:2012-02-10 16:18:27

标签: c linux multithreading sockets

我很抱歉这个问题的基本性,但我在这里遇到了问题。我有一个客户端 - 服务器程序。我不知道有多少连接会来,但它们不是无限的。最后,在所有连接关闭后,输出一些结果。但我遇到的问题是,接受连接是在无限循环中,如何停止输出结果。

由于

4 个答案:

答案 0 :(得分:1)

你需要有某种形式的条件来摆脱你的循环,在你的情况下,超时可能会工作得最好,基本上意味着,如果你没有得到任何新客户x秒,你停止寻找客户端,同样适用于任何连接错误。

还需要查看您正在使用的代码。

答案 1 :(得分:1)

处理EINTR来自accept(2)的错误并终止该程序并点击^C通常有效。

答案 2 :(得分:0)

您可以为SIGTERM信号安装处理程序,该处理程序将设置全局volatile sig_atomic_t变量,并在多路复用循环中测试该变量(可能在pollselect附近)。请记住,signal处理程序无法调用许多函数(只有 async-signal-safe )。

大多数Linux或Posix服务器都可以很好地捕获SIGTERM

您可以考虑使用libevlibevent等事件处理库。

答案 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,终止并且主线程监视器结构,以确保所有子“终止”布尔值在继续之前是真的)或包含操作子线程数的计数器(当一个孩子即将终止它时,通过螺旋锁独占控制计数器,减少它并释放它在终止之前锁定:主线程在计数器包含零之前没有做任何事情。)