我是Linux的新手。 我有两个用户空间进程,A和B,B必须从A接收消息,执行一些处理,并在完成时执行确认。所以我正在研究一种双向消息传递协议,并且看到netlink被用于用户和内核空间之间的通信。有没有办法使用netlink进行两个用户空间进程通信?
如果它不是一个理想的解决方案,还有其他方法可以达到这个目的吗?我正在查看消息队列,但它们似乎是单向通信机制。
答案 0 :(得分:0)
假设首先在内核中有一些代码set up the channel,可以使用通用netlink进行kernel⇆kernel,kernel⇆user和user⇆user通信。在libnl
源代码中,有一个示例libnl/tests/test-genl.c
,它向内核发送消息并从内核接收消息。如果另一个端点是另一个用户空间进程,它将同样有效。
但是,使用UNIX域套接字或D-Bus进行用户通信会更容易(也更便于移植)。
答案 1 :(得分:0)
Netlink最初旨在提供内核 - 用户空间通信。它没有理由不能用于用户空间 - 用户空间通信,但是说,我不明白你为什么会这样做。
如果您想继续使用它,您只能在用户空间中这样做。首先不需要在内核空间中执行任何设置。只需使用AF_NETLINK的套接字系列调用socket()即可。要发送消息,请填充struct sockaddr_nl并相应地设置nl_pid属性(通常将其设置为当前进程的PID),然后调用sendto()。标准的recv()调用可用于接收消息。
所有这一切,并且鉴于您说您是Linux新手,我建议您查看Unix域套接字以满足您的用户空间IPC需求,因为我怀疑它会满足您的要求并且通常应该更容易使用。您还可以查看在某些情况下可以正常工作的消息队列。这里有一个很好的比较:Which is better for local IPC, POSIX message queues (mqueues) or Unix domain (local) sockets?。请注意,您需要链接实时库(librt)才能使用POSIX消息队列。使用一对队列可以很容易地实现使用消息队列的双向通信,每个队列对应一个队列。
答案 2 :(得分:0)