有没有办法可以使用 netlink 在两个用户 space 进程之间进行进程间通信 (IPC)?

Is there a way I can use netlink for Inter-process communication (IPC) between two user space processes?

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

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

假设您在 set up the channel in the first place, it is possible to use generic netlink for kernel⇆kernel, kernel⇆user, and user⇆user communication. In the libnl 源代码的内核中有一些代码,有一个示例 libnl/tests/test-genl.c 向内核发送消息并从内核接收消息。如果另一个端点是另一个用户空间进程,它也会同样有效。

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

Netlink 最初设计用于提供内核-用户space 通信。没有理由不能用于 userspace-userspace 通信,但话虽如此,我不明白你为什么会这样。

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

综上所述,鉴于您说您是 Linux 的新手,我建议您查看用户 space IPC 需求的 Unix 域套接字,因为我怀疑它会满足您的要求,通常应该更易于使用。您还可以查看在某些情况下可以很好地工作的消息队列。这里有一个很好的比较:Which is better for local IPC, POSIX message queues (mqueues) or Unix domain (local) sockets?。请注意,您需要 link 反对实时库 (librt) 才能使用 POSIX 消息队列。使用消息队列的双向通信可以使用一对队列轻松实现,每个方向一个。

如果你真的需要这个,请在​​这里回答 netlink 用户对用户的问题。

有更好的用户间通信方法,如 unix 套接字。

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

example