HarmonyOS鸿蒙Next中求问匿名共享内存如何使用

HarmonyOS鸿蒙Next中求问匿名共享内存如何使用 如题,鸿蒙如何使用匿名共享内存在两个独立的应用之间传输数据

4 回复

使用匿名共享内存实现大数据传输,防止资源竞争

在高并发通信中,当需要传输大数据时,普通的IPC通信方式可能会遇到性能瓶颈。这时候,匿名共享内存就派上用场了。匿名共享内存就像是一个公共的仓库,多个进程可以同时访问这个仓库,将数据存储在其中,实现高效的数据共享。

以下是一个简单的匿名共享内存读写实例代码(以C语言为例):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

// 定义共享内存块大小
#define SHARED_MEM_SIZE 4096

int main() {
    // 创建匿名共享内存
    int fd = shmget(IPC_PRIVATE, SHARED_MEM_SIZE, IPC_CREAT | 0666);
    if (fd == -1) {
        perror("shmget");
        return -1;
    }

    // 将共享内存映射到进程地址空间
    void *shared_mem = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (shared_mem == MAP_FAILED) {
        perror("mmap");
        return -1;
    }

    // 创建子进程
    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
        return -1;
    } else if (pid == 0) {
        // 子进程写入数据到共享内存
        char *data = "Hello, shared memory!";
        memcpy(shared_mem, data, strlen(data) + 1);
        // 通知父进程数据已写入
        kill(getppid(), SIGUSR1);
    } else {
        // 父进程等待子进程写入数据
        sigset_t set;
        sigemptyset(&set);
        sigaddset(&set, SIGUSR1);
        sigwait(&set, NULL);
        // 从共享内存读取数据
        char *read_data = (char *)shared_mem;
        printf("Read from shared memory: %s\n", read_data);
        // 解除共享内存映射
        if (munmap(shared_mem, SHARED_MEM_SIZE) == -1) {
            perror("munmap");
            return -1;
        }
        // 标记共享内存段被销毁
        if (shmctl(fd, IPC_RMID, NULL) == -1) {
            perror("shmctl");
            return -1;
        }
    }

    return 0;
}

在这个示例中,父进程和子进程通过匿名共享内存进行数据交互。子进程将数据写入共享内存,然后通知父进程读取。这种方式避免了通过IPC通信频繁传递大数据带来的性能损耗,同时通过信号量(这里使用SIGUSR1信号)实现了简单的数据同步,防止资源竞争。

参考地址

https://developer.huawei.com/consumer/cn/blog/topic/03165838106012039

更多关于HarmonyOS鸿蒙Next中求问匿名共享内存如何使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ddk_api-V5

鸿蒙有提供API,我想了解的是两个独立进程,非父子进程间如何使用匿名共享内存,

鸿蒙Next的匿名共享内存(Ashmem)通过Native API提供。使用步骤:1. 创建Ashmem对象并设置大小;2. 映射到进程地址空间;3. 进行读写操作;4. 跨进程通信时传递文件描述符。关键接口包括OH_ASharedMemory_Create、OH_ASharedMemory_Map等,需包含<ashmem/ashmem.h>头文件。

在HarmonyOS Next中,匿名共享内存(Ashmem)主要通过SharedMemorySharedMemoryMapping两个核心类来实现跨进程数据共享。以下是关键使用步骤:

  1. 创建共享内存:在提供方应用中,使用SharedMemory的静态方法create()createFromParcel()创建一块指定大小的共享内存区域,并获得其文件描述符(FD)。

  2. 映射与写入数据:通过SharedMemoryMappingmap()方法将共享内存映射到当前进程的地址空间,获取指向内存区域的指针,即可直接写入数据。

  3. 传递文件描述符:将FD通过进程间通信(如RPC、Ability)传递给另一个应用。FD本身可序列化,可通过Parcel进行传递。

  4. 接收方映射与读取:接收方应用使用收到的FD创建SharedMemory对象,同样通过SharedMemoryMapping.map()进行映射,获取指针后读取数据。

注意事项

  • 需同步机制(如信号量)协调读写,避免并发问题。
  • 操作完成后,双方均需调用SharedMemoryMapping.unmap()SharedMemory.close()释放资源。
  • 权限控制需在配置文件中声明相关权限。

此机制适用于大数据量、低延迟的跨进程数据传输场景。

回到顶部