通过Netlink套接字从内核向用户空间多次发送相同的消息

时间:2019-07-10 06:43:00

标签: sockets linux-kernel ipc netlink

我在用户空间和内核空间之间进行了基于Nelink的单播通信,并且效果很好。

下面的调用通过netlink套接字将消息从内核空间发送到用户空间。

res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);

现在我想从内核向用户空间发送3次相同的数据副本。 因此,我看到当nlmsg_unicast返回时,skb_out不存在,可能已经是skb_free。

因此,在致电nlmsg_unicast之前,我想像下面将skb_get(skb_out)的skb_out用户数增加。

skb_get(skb_out);
skb_get(skb_out);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);
res = nlmsg_unicast(nl_sk, skb_out, user_space_process_port_id);

我的解释是,我现在应该能够发送3次相同的味精,因为skb_free不能释放skb_out。但是,内核冻结了。

当我使用skb_copy()而不是skb_get()重复同一件事时,我可以多次发送msg。 我的问题是:skb_copy()是昂贵的操作,我应该能够将相同的内存缓冲区发送到用户空间而不创建副本。

对于我在这里缺少的任何帮助,我们将不胜感激。

0 个答案:

没有答案