有没有办法可以使用 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。
我是 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。