【SOS】【SOCKET】recvfrom 返回值为-1,但errno却为零

clock19 2013-05-02 11:47:09
linux版本:2.6.32.11
C标准库:uclibc (版本没注意)

嵌入式开发中出现一个问题,发现导致问题的原因是:recvfrom返回值为-1,但errno却为零(没有错误码)

recvfrom的说明不是说-1代表出错,并把出错码放在errno么?


RETURN VALUE

Upon successful completion, recvfrom() returns the length of the
message in bytes. If no messages are available to be received and
the peer has performed an orderly shutdown, recvfrom() returns 0.
Otherwise the function returns -1 and sets errno to indicate the error.

求大牛解惑,再求如何跟踪recvfrom的内核实现,多谢!
...全文
747 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
clock19 2013-05-24
  • 打赏
  • 举报
回复
是uclibc 0.9.32 有个bug。uclibc官网有这个log信息。
clock19 2013-05-02
  • 打赏
  • 举报
回复
继续跟踪内核recvfrom的最外层实现, 出现异常时,下面函数的返回值为-11。但是用户层的errno还是为0,怎么会这样?

/* 文件:net/socket.c */
SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
		unsigned, flags, struct sockaddr __user *, addr,
		int __user *, addr_len)
{
	struct socket *sock;
	struct iovec iov;
	struct msghdr msg;
	struct sockaddr_storage address;
	int err, err2;
	int fput_needed;

	sock = sockfd_lookup_light(fd, &err, &fput_needed);
	if (!sock)
		goto out;

	msg.msg_control = NULL;
	msg.msg_controllen = 0;
	msg.msg_iovlen = 1;
	msg.msg_iov = &iov;
	iov.iov_len = size;
	iov.iov_base = ubuf;
	msg.msg_name = (struct sockaddr *)&address;
	msg.msg_namelen = sizeof(address);
	if (sock->file->f_flags & O_NONBLOCK)
		flags |= MSG_DONTWAIT;
	err = sock_recvmsg(sock, &msg, size, flags);

	if (err >= 0 && addr != NULL) {
		err2 = move_addr_to_user((struct sockaddr *)&address,
					 msg.msg_namelen, addr, addr_len);
		if (err2 < 0)
			err = err2;
	}

	fput_light(sock->file, fput_needed);
out:
	return err;
}

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧