我试图编写一些基本的内核模块 – 用户空间程序通信使用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] 举报,一经查实,本站将立刻删除。