【问题标题】:Does NDK provide support for message queues?NDK 是否提供对消息队列的支持?
【发布时间】:2018-07-27 11:30:53
【问题描述】:

我正在尝试使用 android ndk 构建一个共享库。运行 ndk build 时出现此错误

fatal error: 'mqueue.h' file not found

根据我在谷歌上搜索的理解,Android 确实提供了对某些 POSIX 或 System V 功能(如消息队列)的支持。

所以我想知道这是否正确?如果是,我有哪些选择 - 我可以对我的应用程序进行哪些更改以模仿消息队列?

(我在 Ubuntu 14.04 PC 上使用 android-ndk-r16b)

【问题讨论】:

    标签: android-ndk ipc message-queue


    【解决方案1】:

    是的,Android 以及其他一些 SysV IPC 机制不支持 POSIX 消息队列。简而言之,这是因为可能导致不可回收的资源泄漏。这不仅适用于“忘记”释放获取的 IPC 资源的错误应用程序,而且适用于所有应用程序。原因是Android 密集使用kill(app_pid, SIGKILL) 将系统资源从后台进程回收到用户刚刚启动的新进程。结果应用程序死亡,没有机会执行拆卸。内核无法释放该 IPC 资源,因为它们可能以不可预知的方式被其他进程共享(与文件描述符和虚拟内存不同)。请记住,Android 主要在资源受限的硬件上运行,因此某种类型的资源重新安排是不可避免的。 更多背景是here。旧的 NDK 包包含此文档,但在某些时候已被删除。

    Android 上 IPC 的替代方法通常包括基于 Binder 的解决方案。在本机代码中,您可以使用为共享内存段提供接口的ashmem。最新的平台版本向其公开了公共 API,请参阅 <android/sharedmem.h>。但是对于旧平台,您可以通过与 ashmem 驱动程序直接交互来实现类似的功能,请参阅libcutils 来源。

    最后,您可能仍然使用管道、UNIX 域套接字,并且可能还使用命名管道(当然,如果底层文件系统支持此类 inode)。

    【讨论】:

    • 谢谢。我最终实现了一个环形缓冲区。它不是万无一失的,因为我必须用足够大的大小初始化缓冲区,以免消息被覆盖。因此不是最好的选择,但它有效。活页夹看起来相当复杂。有时间会寻找更好的解决方案
    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多