简单服务器的问题避免

来源:互联网 发布:大数据时代 四大挑战 编辑:程序博客网 时间:2024/06/14 10:01

一。

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 { ; (此处循环可以为空)} } 。

 

0 0
原创粉丝点击