不同于顺序服务器,并发服务器 就要能在一个时间为多个客户端提供服务。 例如,一个聊天服务器可能服务一个特定的客户端数小时 ──在停止为这个客户端服务之前服务器不能等待, 除非是在等待一下个客户端到来之前的间隙才能等待。
这需要在我们的流程图中做一个重要的更改:
我们将提供服务从 守护进程移至它自己的服务进程。
然而,因为每个子进程都继承所有打开的文件(套接字被像文件一样处理), 新进程不仅继承“accept()返回的句柄,” 那是指调用accept
返回的套接字;新进程也继承 顶级套接字,这是顶级进程一开始打开的套接字。
然而,服务进程不需要这个套接字, 应该立即关闭(close
)它。同样的, 守护进程不再需要 accept()返回的套接字, 不仅应该,还必须 关闭(close
)它──否则,
那迟早会耗尽可用的文件描述符。
在服务进程完成服务之后,
它将关闭accept()返回的套接字。
它不会返回到accept
,而是退出进程。
在UNIX®上,一个进程并不真正的退出, 而是返回至父进程。典型情况中, 父进程等待(wait
)子进程, 并取得一个返回值。但是,我们的守护进程
不能简单的停止或等待,那有违建立其它进程的整个目的。 但是如果从不使用wait
, 它的子进程可能会成为僵尸── 不再有功用可仍然徘徊着。
出于那样的原因,守护进程
需要在初始化守护进程阶段设置 信号处理程序。 至少要处理信号SIGCHLD
,
这样守护进程可以从系统清除僵尸返回值并释放僵尸占用的系统资源。
这是现在我们的流程图包含一个进程信号框的原因,
它不与任何其它框相连接。顺便说一句,许多服务器程序也处理SIGHUP
, 作为超级用户发出的要求重读配置文件的信号。
这允许我们不必终止或重启服务器程序就改变设置。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.