根据linux内核源码查找recv返回EBADF(errno 9)的原因

本文探讨了在Linux内核2.6.18版本中,recv函数返回EBADF(errno 9)错误的原因。通过分析recvfrom的实现及fget_light、fcheck_files函数,揭示了EBADF可能源自无效的socket fd或已被其他线程关闭。同时,文章还介绍了max_fds的计算方式,并指出进程资源限制(如open files限制)通常在分配新fd时检查,而不是在recv操作时导致EBADF错误。
摘要由CSDN通过智能技术生成

linux的内核版本是2.6.18,x86_64.

man里的解释是:

EBADF

The argument s is an invalid descriptor

我的模拟测试环境是:

前端loadrunner模拟web点击,通过后端的weblogic压自己的服务的时候发现,有时候recv会收到这个错误,意思就是这个fd已经失效了,但是有点不是很明白,所以查询下内核实现,验证下。

首先recv的实现就是调用的recvfrom:


/*
 *	Receive a datagram from a socket. 
 */

asmlinkage long sys_recv(int fd, void __user * ubuf, size_t size, unsigned flags)
{
	return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
}

然后看 sys_recvfrom 的实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值