2011-10-05 137 views
0

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

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

计数的客户端数量开启之后他们都将关闭,显然是零(这已经被错误校验以确保它是正确的)。有谁知道我可以创建可以在一个客户端设置标志的方式,并且对每个客户端都有相同的价值吗?如果这是有道理的..顺便说一句,我在C编码。

+1

很多方法可以做到这一点。这里有一个有用的关键字是“进程间通信”http://en.wikipedia.org/wiki/Inter-process_communication – HostileFork

回答

0

你需要实现一个单独的服务器供大家说话,他会向所有的客户端广播,并用客户端计数来更新它们,但实质上并没有太多复杂功能来说话和跟踪所有其他客户是一个挑战。

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

希望这照耀一些光。

0

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

+0

这将工作,我几乎用了SIGUSR1,但后来我记得exit()状态。 。呃..这花了我几秒钟来补充,一切都像我想要的那样工作 – newuser12

+0

嗯,你没有说发出'quit'的客户端马上要断开连接,只是服务器应该开始有序关闭。 :-) –

+0

是的,绝对应该把它放在我的细节的某个地方,但是我从这些答案中学到的东西比以往任何时候都要多:)感谢你们 – newuser12

0

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

或(如果可能的话),你可以只启动线程,而不是分叉过程,并用两个全球int S表示countflag和全局互斥锁保护他们。 pthread API非常容易用于不需要进行大量线程间通信的简单事情,并且创建线程的速度要快于fork + exec