2017-05-30 114 views
0

我是Linux的新手。 我有两个用户空间进程A和B,B必须接收来自A的消息,做一些处理,并在完成时进行确认。所以我在看双向消息协议,并且看到netlink被用于用户和内核空间之间的通信。有没有办法使用netlink进行两个用户空间进程通信?有没有一种方法可以将netlink用于两个用户空间进程之间的进程间通信(IPC)?

如果这不是一个理想的解决方案,有没有其他的方法来实现这一点?我正在查看消息队列,但它们似乎是单向通信机制。

回答

0

假设您首先在内核中有一段代码为set up the channel,则可以使用通用netlink进行内核,内核用户和用户之间的通信。在libnl源文件中,有一个示例libnl/tests/test-genl.c,它向内核发送消息并从内核接收消息。如果另一个端点是另一个用户空间进程,它将同样有效。

但是,使用UNIX域套接字或D-Bus进行用户用户通信会更容易(也更便携)。

+0

谢谢你的解释!通过评论,看起来像Unix域套接字将是我的案例更好的解决方案,我会看看它。 – HackX123

0

Netlink最初设计用于提供内核用户空间通信。没有理由为什么它不能用于用户空间与用户空间的通信,但是说,我不明白你为什么会这样做。

如果你想继续使用它,你可以在用户空间中完成。不需要首先在内核空间中执行任何设置。只需使用AF_NETLINK套接字系列调用socket()即可。要发送消息,填充struct sockaddr_nl并适当地设置nl_pid属性(通常将其设置为当前进程的PID),然后调用sendto()。标准的recv()调用可以用来接收消息。所有这些说法,并且假设你说你是Linux新手,我建议你考虑一下你的用户空间IPC的Unix域套接字,因为我怀疑它会满足你的要求,通常应该更容易使用。你也可以看看在某些情况下可以很好地工作的消息队列。这里有一个很好的比较:Which is better for local IPC, POSIX message queues (mqueues) or Unix domain (local) sockets?。请注意,您需要链接实时库(librt)才能使用POSIX消息队列。使用消息队列的双向通信可以使用一对队列轻松实现,每个队列一个队列。

+0

非常感谢您的详细解释!我一定会看看Unix域套接字以及我的目的。 – HackX123