当我们从用户进程调用sendmsg API调用时,调用输入函数并向内核发送消息。好的,但是当我们调用recvmsg API调用时,是否再次调用了输入函数?我在例子中看到这个我无法发表评论,因为我没有声誉。该帖子的标题是:“如何使用netlink socket与内核模块通信?”所以,任何人都可以看到这个例子并告诉我如何区分写入内核套接字和读取它的内容。
答案 0 :(得分:0)
为什么要再次调用输入函数? sendmsg()
发送并recvmsg()
收到。 hello_nl_recv_msg()
仅在内核模块收到消息时执行。
在该示例中,用户空间程序使用sendmsg()
函数将消息 A 发送到内核。
消息 A 到达内核。内核调用hello_nl_recv_msg()
。消息 A 封装在参数skb
。
内核模块选择向进程ID发送skb
的进程发送响应。它会创建消息 B 。内核模块使用nlmsg_unicast()
函数将消息 B 发送到用户空间。
recvmsg()
功能期间,消息 B 出现在用户空间中。 (因为用户空间程序的进程ID与内核模块写入的进程ID相同。)
recvmsg()
会一直睡到收到内核的消息,因此在调用该函数之前,您不必担心内核是否已经应答。