简单服务器的问题避免

一。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值