在这里,我想使用 System IPCs 方法,例如
<sys/msg.h> /* SysV message queues */
<sys/ipc.h> /* General IPC definitions */
这里我的 android NDK 代码是 C 语言的,我使用消息队列 IPC 机制与其他 C 应用程序进行通信。
所以请让我知道有什么方法可以实现这个 IPC 目标吗?如何在 android NDK 代码中实现这种 IPC 机制?
在这里,我想使用 System IPCs 方法,例如
<sys/msg.h> /* SysV message queues */
<sys/ipc.h> /* General IPC definitions */
这里我的 android NDK 代码是 C 语言的,我使用消息队列 IPC 机制与其他 C 应用程序进行通信。
所以请让我知道有什么方法可以实现这个 IPC 目标吗?如何在 android NDK 代码中实现这种 IPC 机制?
一年前,我写了一份关于这个话题的调查。这是其中的一部分:
2 Unix IPC机制
Unix IPC 机制包括:
同时 Unix System-V IPC 机制不包含在 Android 中。Bionic 有意不提供对 System-V IPC 机制的支持,例如 semget()、shmget()、msgget() 提供的机制。这样做的原因是为了避免拒绝服务 [11]。
2.1 Unix 信号
我们可以在维基百科中找到对 unix 信号如何工作的最佳解释之一:“信号是 Unix、类 Unix 和其他兼容 POSIX 的操作系统中使用的一种有限的进程间通信形式。本质上,它是发送给进程的异步通知,以通知它发生的事件。当信号发送到进程时,操作系统会中断进程的正常执行流程。在任何非原子指令期间都可以中断执行。如果进程先前已注册信号处理程序,则执行该例程。否则将执行默认的信号处理程序。” 似乎unix信号在Android编程中被使用。此外,一些信号在调试模式下被禁用. 但是,这是一种可能的 IPC 机制。
2.2 Unix管道
管道是一种通信机制,允许直接连接一个进程的输出流和另一个进程的输入流。有两种类型的 unix 管道:命名管道和未命名管道。似乎在 Android 编程中只使用了命名管道。在这种情况下,两个进程使用连接输出和输入的特殊文件进行交互。值得一提的是,管道是一种单向的通信方式,即一个进程始终是读卡器,第二个进程始终是写卡器。通信文件必须在 Linux 文件系统上创建,因为 sdcard 的 FAT32 不允许创建管道。这是一个如何在Android中创建和使用命名 unix 管道的示例(俄语)。此示例的源代码可在此处找到。
2.3 Unix域套接字
与 unix 管道相反,Unix 域套接字允许以两种方式传输信息:从服务器到客户端和从客户端到服务器。Unix 域套接字和 unix 管道使用文件系统作为地址名称空间。这意味着服务器和客户端使用特殊文件来建立通信。考虑到 Android,有两个类用于对 unix 域套接字进行编程:LocalServerSocket 和 LocalSocket。所有的实现都可以围绕这两个类构建,并且不需要使用本机代码来制作 unix 域套接字。这里展示了一个如何使用 unix 域套接字的简单示例。
[11] Android ndk 文档。android-ndk-r6b 的 NDK 文档