我想添加一个函数,当TCP上的数据传递给用户空间时做一些事情,所以我在inet_recvmsg()中添加代码,如下所示:
int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags)
{
struct sock *sk = sock->sk;
int addr_len = 0;
int err;
sock_rps_record_flow(sk);
err = sk->sk_prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
flags & ~MSG_DONTWAIT, &addr_len);
if (err >= 0)
msg->msg_namelen = addr_len;
//my code here begin
if (err > 0 && sk->sk_family == IPPROTO_TCP)
my_function(sk, msg, err);
//my code here end
return err;
}
据我所知,如果调用者成功接收到一些数据,该函数将返回err> 0,这意味着复制到用户空间提供的缓冲区的数据长度,并且接收到的数据已经被复制到msg指向的缓冲区。 > iov_iter.iov。但是当我调试my_function()时,我遇到了很奇怪的事情:
为什么这样的结果,或者我的理解有什么不对?
另外,我的Linux内核是4.9.100