一。
1. 多进程服务器; 一个管理进程, 当客户端链接时, 起一个子进程与客户端进程通信;
2. 客户端:普通客户端程序, 与服务器之间保持长链接。
3.问题:
此时设计到一个问题,当起 n 个客户端连接服务器时;服务器会产生 n 个子线程,用于各客户端通信,此时,加入一个客户端主动关闭链接,
服务器应该关掉它对应的子进程,并对这个子进程进行回收,防止产生僵尸进程。
① 注册信号,当客户端主动断开连接, 服务器子进程会退出, 此时会向父进程,发送 SIGCHID 信号;父进程注册信号处理函数; signal(SIGCHID, func_data);
func_data() { wait(NULL); } (伪代码, 该函数的格式不对)。
会调用该信号函数回收子进程;
②加入:多个链接客户端同时关闭连接, 此时会同时向服务器发送:FIN标识位,服务器多个子进程同时退出, 并同时向主进程 发出SIGCHID信号; 这时,上面的
程序设计就出现问题。 因为: SIGCHID 信号是不可靠信号,当多个信号同时向父进程发送时, 服务器主进程可能回处理 1 个, 或多个 < n, 或者n个(理想状态),那么就会有很大可能产生僵尸进程。 为了避免这种情况的发生; 上面的信号注册函数, 就应该写成这样, 才可以避免该问题。
func_data() { int mypid = 0; while( ( mypid = waitpid(-1, NULL, WNOHANG ) ) > 0 { ; (此处循环可以为空)} } 。