我是 Linux 的新手。我有两个用户空间进程,A 和 B,B 必须从 A 接收消息,进行一些处理,并在完成后确认。所以我正在研究一种双向消息传递协议,并且看到 netlink 被用于用户和内核空间之间的通信。有没有办法使用 netlink 进行两个用户空间进程通信?
如果这不是一个理想的解决方案,还有其他方法可以实现吗?我正在查看消息队列,但它们似乎是单向通信机制。
Netlink 最初旨在提供内核-用户空间通信。没有理由不能将它用于用户空间-用户空间通信,但就是说,我不明白你为什么会这样做。
如果你想继续使用它,你可以只在用户空间中这样做。无需先在内核空间中执行任何设置。只需使用 AF_NETLINK 的套接字系列调用 socket()。要发送消息,请填充 struct sockaddr_nl 并适当设置 nl_pid 属性(这通常设置为当前进程的 PID),然后调用 sendto()。标准的 recv() 调用可用于接收消息。
综上所述,鉴于您说您是 Linux 新手,我建议您查看 Unix 域套接字以满足您的用户空间 IPC 需求,因为我怀疑它会满足您的要求并且通常应该更易于使用。您还可以查看在某些情况下可以很好地工作的消息队列。这里有一个很好的比较:本地 IPC、POSIX 消息队列(mqueues)还是 Unix 域(本地)套接字哪个更好?. 请注意,您需要链接实时库 (librt) 才能使用 POSIX 消息队列。使用消息队列的双向通信可以很容易地使用一对队列来实现,每个方向一个队列。