2

我是 Linux 的新手。我有两个用户空间进程,A 和 B,B 必须从 A 接收消息,进行一些处理,并在完成后确认。所以我正在研究一种双向消息传递协议,并且看到 netlink 被用于用户和内核空间之间的通信。有没有办法使用 netlink 进行两个用户空间进程通信?

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

4

3 回答 3

3

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

如果你想继续使用它,你可以只在用户空间中这样做。无需先在内核空间中执行任何设置。只需使用 AF_NETLINK 的套接字系列调用 socket()。要发送消息,请填充 struct sockaddr_nl 并适当设置 nl_pid 属性(这通常设置为当前进程的 PID),然后调用 sendto()。标准的 recv() 调用可用于接收消息。

综上所述,鉴于您说您是 Linux 新手,我建议您查看 Unix 域套接字以满足您的用户空间 IPC 需求,因为我怀疑它会满足您的要求并且通常应该更易于使用。您还可以查看在某些情况下可以很好地工作的消息队列。这里有一个很好的比较:本地 IPC、POSIX 消息队列(mqueues)还是 Unix 域(本地)套接字哪个更好?. 请注意,您需要链接实时库 (librt) 才能使用 POSIX 消息队列。使用消息队列的双向通信可以很容易地使用一对队列来实现,每个方向一个队列。

于 2017-05-31T23:05:48.397 回答
1

假设您首先在内核中有一些代码来设置通道,则可以使用通用 netlink 进行 kernel⇆kernel、kernel⇆user 和 user⇆user 通信。在libnl源代码中,有一个libnl/tests/test-genl.c向内核发送消息并从内核接收消息的示例。如果另一个端点是另一个用户空间进程,它会同样有效。

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

于 2017-05-31T02:44:13.837 回答
0

如果您确实需要,请在此处为 netlink 用户对用户回答。

用户与用户之间的通信有更好的方法,例如 unix socket。

用户到用户网络链接的关键是 pid。

例子

于 2019-08-05T03:58:59.493 回答