【问题标题】:Can we use System IPC in android NDK code我们可以在 android NDK 代码中使用 System IPC
【发布时间】:2012-07-11 08:42:23
【问题描述】:

这里我想使用像

这样的 System IPCs 方法
  <sys/msg.h>   /* SysV message queues */
  <sys/ipc.h>   /* General IPC definitions */

这里我的 android NDK 代码是 C 语言,我使用消息队列 IPC 机制与其他 C 应用程序进行通信。

所以请告诉我有什么方法可以实现这个 IPC 目标吗? 如何在 android NDK 代码中实现这种 IPC 机制?

【问题讨论】:

标签: android c android-ndk


【解决方案1】:

一年前,我写了一份关于这个主题的调查。这是其中的一部分:

2 Unix IPC 机制

Unix IPC 机制包括:

  • Unix 信号。
  • Unix 管道。
  • Unix 域套接字。

同时 Unix System-V IPC 机制不包含在 Android 中。 Bionic 故意不提供对 System-V IPC 机制的支持,例如 由 semget()、shmget()、msgget() 提供。这样做的原因是为了避免否认—— 服务 [11]。

2.1 Unix 信号

我们可以在wikipedia 中找到对 unix 信号如何工作的最佳解释之一:“A 信号是 Unix、类 Unix 和 其他符合 POSIX 的操作系统。本质上它是一个异步通知- 发送到进程以通知它发生的事件。当一个信号 发送到进程时,操作系统会中断进程的正常执行流程 化。在任何非原子指令期间都可以中断执行。如果进程有 先前注册了一个信号处理程序,该例程将被执行。否则默认 信号处理程序被执行。” 似乎unix信号在Android编程中被使用。而且, debug mode 中的某些信号已被禁用。但是,它是一个可能的 IPC 机制。

2.2 Unix 管道

管道是一种允许直接连接输出流的通信机制 一个进程与另一个进程的输入链。有两种类型的unix 管道:命名管道和未命名管道。似乎只有在Android编程中 使用命名管道。在这种情况下,两个进程使用一个特殊文件进行交互,该文件 连接输出和输入。需要说明的是,管道是单向方式 通信,即一个进程总是读者,第二个进程总是写者。 通信文件必须在 Linux 文件系统上创建,因为 sdcard 的 FAT32 不允许创建管道。这是一个如何创建命名 unix 管道的示例 并用于Android(俄语)。这个例子的源代码可以在here找到。

2.3 Unix 域套接字

Unix 域套接字,与 unix 管道相反,允许在 两种方式:从服务器到客户端和从客户端到服务器。 Unix 域套接字 和 unix 管道使用文件系统作为地址名称空间。这意味着服务器和 客户端使用特殊文件建立通信。考虑到Android有两个 用于编程 unix 域套接字的类:LocalServerSocket 和 本地套接字。所有的实现都可以围绕这两个类构建,它是 不需要使用本机代码来制作 unix 域套接字。一个简单的例子如何 使用 unix 域套接字显示为here

[11] Android ndk 文档。 android-ndk-r6b 的 NDK 文档

【讨论】:

  • 所以我可以在 android ndk 中使用 Unix 域套接字,因为它有利于通信。
  • 不,不是。例如,最好使用像 Binder 这样的特殊 Android IPC。我写这个调查是为了表明这是可能的,但不建议这样做。
  • 但是我怎样才能将这些东西传达给在 android 上运行的 C 服务应用程序。 Binder 正在用于 Android NDK C 代码与其他 C 应用程序代码之间的通信?
  • Binder是Android IPC机制。因此,是的,它可以用来在两个本机进程之间进行通信。
  • Android 本身在一些地方使用 unix 域套接字,在这些地方,binder 会增加复杂性而没有什么有用的收益。
猜你喜欢
  • 2011-11-27
  • 2011-09-05
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多