微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Netlink套接字和libnl – nl_recvmsgs_default返回-16EBUSY

我试图编写一些基本的内核模块 – 用户空间程序通信使用netlink套接字(libnl在用户端)。 用户空间程序向内核发送消息,并期待回复。 不幸的是,接收答复失败,返回值-16(EBUSY)。

有趣的是,当我直接从netlink套接字接收数据时,使用nl_socket_get_fd(sock)上的标准系统调用recv ,一切正常!

有没有人有一个想法,为什么发生这种情况?

这里是用户间的代码(parse_cb是一个不被调用的callback函数):

如何使用kernel / perf_event *。

Linux计划一个进程或线程?

printk loff_ttypes的格式说明符?

冗余Linux内核系统调用

在Linux内核中从path获取inode

struct nl_sock *sock; struct nl_msg *msg; int family,res; // Allocate a new netlink socket sock = nl_socket_alloc(); // Connect to generic netlink socket on kernel side genl_connect(sock); // Ask kernel to resolve family name to family id family = genl_ctrl_resolve(sock,PSVFS_FAMILY_NAME); // Construct a generic netlink by allocating a new message,fill in // the header and append a simple integer attribute. msg = nlmsg_alloc(); genlmsg_put(msg,NL_AUTO_PID,NL_AUTO_SEQ,family,NLM_F_ECHO,PSVFS_C_INIT,PSVFS_VERSION); nla_put_string(msg,PSVFS_A_MSG,"stuff"); // Send message over netlink socket nl_send_auto_complete(sock,msg); // Free message nlmsg_free(msg); nl_socket_modify_cb(sock,NL_CB_VALID,NL_CB_CUSTOM,parse_cb,NULL); res = nl_recvmsgs_default(sock); printf("After receive %i.n",res);

下面是由用户空间程序发送的messsage的内核端callback函数(正确调用了这个函数):

int psvfs_vfs_init(struct sk_buff *skb2,struct genl_info *info) { send_to_daemon("VFS initialized.",info->snd_seq+1,info->snd_pid); return 0; }

这里是'send_to_daemon'函数

int send_to_daemon(char* msg,int command,int seq,u32 pid) { int res = 0; struct sk_buff* skb; void* msg_head; skb = genlmsg_new(NLMSG_GOODSIZE,GFP_KERNEL); if (skb == NULL) { res = -ENOMEM; goto out; } msg_head = genlmsg_put(skb,seq,&psvfs_gnl_family,command); if (msg_head == NULL) { res = -ENOMEM; goto out; } res = nla_put_string(skb,msg); if (res != 0) goto out; genlmsg_end(skb,msg_head); res = genlmsg_unicast(&init_net,skb,pid); if (res != 0) goto out; out: return res; }

关于在terminal上打印KERNEL消息

linux内核进程调度器的FCFSalgorithm

如何同步内核时间和logcat时间?

有关内核3.x上设备驱动程序编程的文档

向内核或用户空间推送代码,出于性能原因?

好的,我发现这里有什么问题。

我终于发现, libnl函数有自己的错误代码,不同于标准的POSIX返回码,-16代表NLE_SEQ_MISMATCH 。

问题是由分配给我的消息的序列号错误造成的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐