【问题标题】:fork() - closing serverfork() - 关闭服务器
【发布时间】:2011-10-05 02:21:27
【问题描述】:

我编写了一个服务器程序,可以使用 fork() 处理多个客户端。我有一个信号处理程序,在需要的地方进行错误检查,并且一切正常。我设置了如果客户端输入“退出”,服务器应该停止接受连接,让打开的客户端完成通信,并在所有客户端关闭后关闭。为此,每当输入“退出”时,我都会将一个 int 标志设置为 0。由于每个子进程中的变量仅适用于该进程,并且不会影响其他子进程或父进程,因此我可以'不跟踪标志何时设置为 0。在我的信号处理程序中,我正在检查

    if( count == 0 && flag == 0)
    //close server and exit program

count 是打开的客户端的数量,在它们全部关闭后显然会为零(这已经过错误检查以确保它是正确的)。有谁知道我可以创建一个可以在一个客户端内设置的标志,并且对每个客户端都有相同的值?如果这有意义.. 顺便说一句,我正在用 C 编码。

【问题讨论】:

标签: c sockets unix ipc fork


【解决方案1】:

您需要实现一个服务器供每个人交谈,他将广播回所有客户端以使用客户端计数更新它们,但本质上没有太多复杂的说话和跟踪所有其他客户端有点挑战。

这也是在不同客户端之间路由和传输消息的地方。

希望这能带来一些启发。

【讨论】:

    【解决方案2】:

    接收quit 命令的子进程需要发送一个信号(例如SIGUSR1——我不建议为此使用SIGTERM,除非您打算尽快关闭所有客户端可能)到其父级,并让父级在该信号处理程序的 内存空间中设置标志。 (父母可以通过将getpid() 的结果存储在某个地方来让每个人都知道它的pid。)

    【讨论】:

    • 这行得通,我几乎使用了 SIGUSR1,但后来我记得 exit() 状态.. duh.. 这花了我几秒钟的时间来添加,一切都像我想要的那样工作
    • 好吧,您并没有说发出quit 的客户端会立即断开连接,只是服务器应该开始有序关闭。 :-)
    • 是的,绝对应该把它放在我的详细信息中,但我确实从这些答案中学到了比以往任何时候都多的东西:) 谢谢大家
    【解决方案3】:

    有许多 IPC 机制可以做到这一点……尤其是信号量。您可以创建一组两个信号量,并将一个用于您的孩子计数,一个用于您的退出标志。当您启动程序时,客户端计数将被初始化为零,而退出标志将被初始化为 1。当每个孩子启动时,它应该在客户端计数上加一......并在它退出时减一。当客户端收到退出命令时,它会将退出标志归零。当两个信号量都为零时,主程序会知道什么时候一切都完成了。

    或者(如果可能)您可以只启动线程而不是分叉进程,并使用两个全局 ints 用于 countflag 以及一个全局互斥锁来保护它们。 pthreads API 相当容易用于不需要进行大量线程间通信的简单事情,并且创建线程比fork+exec 更快。

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2010-12-31
      • 2017-02-09
      • 2011-03-08
      • 2023-03-26
      相关资源
      最近更新 更多