我们可以在android NDK代码中使用System IPC吗?

时间:2012-07-11 08:42:23

标签: android c android-ndk

这里我想使用像

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

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

所以请让我知道有没有办法实现这个IPC目标? 如何在android NDK代码中实现这个IPC机制?

1 个答案:

答案 0 :(得分:12)

一年前,我写了一篇关于这个话题的调查。以下是其中的一部分:

2个Unix IPC机制

Unix IPC机制包括:

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

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

2.1 Unix信号

我们可以在wikipedia中找到unix信号如何工作的最佳解释之一:“A 信号是一种有限形式的进程间通信,用于Unix,类Unix和 其他符合POSIX标准的操作系统。基本上它是一个异步通知 发送到进程以便通知它发生的事件。当信号是 发送到进程,操作系统中断进程的正常执行流程 - 灰。在任何非原子指令期间都可以中断执行。如果过程有 以前注册了一个信号处理程序,该例程被执行。否则默认 执行信号处理程序。“ 似乎unix信号在Android编程中被随后使用。此外, 某些信号已在debug mode中停用。但是,这是一个可能的IPC 机构。

2.2 Unix管道

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

2.3 Unix域套接字

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

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