【问题标题】:Is there a way I can use netlink for Inter-process communication (IPC) between two user space processes?有没有办法可以使用 netlink 在两个用户空间进程之间进行进程间通信(IPC)?
【发布时间】:2017-10-31 13:37:24
【问题描述】:

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

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

【问题讨论】:

    标签: linux ipc netlink userspace


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的解释!通过 cmets,看起来 Unix Domain Sockets 对我的情况来说是一个更好的解决方案,我会看看它。
    【解决方案2】:

    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 消息队列。使用消息队列的双向通信可以很容易地使用一对队列来实现,每个方向一个。

    【讨论】:

    • 非常感谢您的详细解释!为了我的目的,我肯定也会看看 Unix Domain Sockets。
    【解决方案3】:

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

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

    用户到用户netlink的关键是pid。

    example

    【讨论】:

      最近更新 更多