UNP第五章总结

UNP第五章总结

1.处理信号SIGCHLD

当服务器子进程退出时会向父进程传递SIGCHLD信号。如果不处理该信号将僵死的子进程回收,则太多的僵死进程会占用过多系统资源。
wait和waitpid
wait函数会阻塞回收僵死进程,如果没有子进程退出将一直等待
waitpid函数可以设置WNOHANG将其设置为非阻塞的。

void
 sig_chld(int signo)
 {
 	pid_t pid;
 	int stat;
 	//wait(&stat);
 	while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
 	printf("child %d terminated\n", pid);
	return;
 }
  1. wait的缺点:由于调用信号处理函数时,相同的信号会被阻塞。如果在信号处理函数调用时又有多个子进程退出,而wait只调用一次无法回收多个子进程。当信号处理函数调用完成时SIGCHLD信号只会被再处理一次。且由于wait是阻塞的我们不能使用while循环来调用wait进行多个子进程的回收。
  2. waitpid:waitpid可以是非阻塞的,因此可以在信号处理函数中使用while循环调用waitpid函数,实现一次调用回收多个的效果。

2. 正确处理被信号中断的系统调用

for ( ; ; ) {
 	clilen = sizeof(cliaddr);
 	//accept(listenfd, (SA*)&cliaddr, &clilen);
 	if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
 	if (errno == EINTR)
 		continue;
 	else
 		err_sys("accept error");
	 }
 	if ( (childpid = Fork()) == 0) {
 		Close(listenfd);
 		str_echo(connfd); 
 		exit(0);
 	}
 	Close(connfd);
 }

当父进程阻塞在accept上时,如果被SIGCHLD信号中断,并终止。因此需要对返回的错误进行处理。
当编写信号处理函数时需要正确认识被中断的系统调用并处理他们

3. 服务器进程退出

  1. 服务器进程退出时会向客户端发送FIN
  2. 如果客户端向已关闭的服务器端发送数据则服务器端会返回RST
  3. 客户端继续向收到RST的socket写数据会触发SIGPIPE信号并返回EPIPE错误

4. 服务器崩溃

  1. 服务器崩溃即从网络上消失,不发送FIN
  2. 此时客户端并不知情,客户端向服务器端多次发送数据未收到ACK后会返回ETIMEOUT
  3. 想要在未发生数据前就检测出服务器端崩溃使用SO_KEEPALIVE套接字选项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值