recv函数异常处理

网络模型:

通信进程为一个常驻内存进程,监听客户端的请求,当到达一个请求后,fork出一个子进程,做具体业务处理。

此时服务端对于recv函数的处理一般会是

sigset(SIGALARM, TimeOut);

alarm(time_out)

while(recv(...)<=0){

    if(errno == EINTR)

        continue;

    else

        return/break;

}

如果我们在TimeOut函数里面没有直接调用exit
,而此时服务端的recv又不断获得error==ENITR,则子进程会一直会在recv和中断信号处陷入死循环,子进程不会退出,可能会造成占用过高的CPU(比如父进程超时后后,然后客户端退出,此时子进程就会不断获得error==EINTR)

解决方法:

1.在超时处理函数中直接调用exit,这样的话子进程的套接字不能及时的close(可以使用setjmp保存堆栈信息,同时在超时处理函数中使用longjmp跳回到保存的堆栈信息关闭套接字);

2.在while处增加循环次数的判断,比如超过5次子进程退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值