C mmap() 共享内存写入在其他进程中看不到

标签 c shared-memory mmap

我正在使用 shm_open、ftruncate 和 mmap 在共享内存中存储一​​个动态创建的二维数组。当我对数组进行更新时,更新仅在进行该更新的进程中可见,而没有其他进程使用该共享内存映射。事不宜迟——代码(相关位):

int fd;
int** graph;
fd = shm_open("/graph", O_RDWR|O_CREAT, 0666);
ftruncate(fd, sizeof(int)*numVertices*numVertices);
graph = (int**) mmap(NULL, sizeof(int)*numVertices*numVertices, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
foo(numVertices, fd);

/* Down to function definition */
void foo(int numVertices, int fd) {
    int i=0;
    for (i; i<num_processes; i++) {
        int pid = fork();
        if (pid == 0) {
            int **graph = (int**) mmap(NULL, sizeof(int)*numVertices*numVertices, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
            graph_algorithm(i, numVertices, graph);
        }
    } 
}

void graph_algorithm(int proc_num, int numVertices, int** graph) {
     pthread_mutex_lock(&mutex);
     if (proc_num == 0) {
          graph[0][0] = 1;
     }
     pthread_mutex_unlock(&mutex);

     printf("Process %d: %d\n", proc_num, graph[0][0]);
}

当在 graph_algorithm 中完成打印时,proc_num 为 0 的进程在 graph[0][0] 处有 1,但所有其他进程保持旧值 0。我省略了 fork 和 mmap 的错误检查——但是是问题的要点。我还尝试在 graph[0][0] = 1 之后调用 msync(graph, sizeof(int)*numVertices*numVertices, MS_SYNC) 但无济于事。这是我第一次使用共享内存,我无法找出我做错了什么。据我所知,这里或任何其他网站都没有出现这个问题。非常感谢任何帮助。

最佳答案

我怀疑问题是您使用了双指针,特别是考虑到您没有指定 graph_algorithm() graph 的维数是多少。在此上下文中,graph[0][0] 将等同于 *(*graph),它可能指向也可能不指向映射内存。您需要确保您的数组指向映射内存的单个连续区域。只要您知道至少一个维度,您仍然可以获得二维数组。因此,您可以使用 graph[x * numVertices + y] 而不是 graph[x][y]。根据您的编译器,您可能仍然可以使用 double 组,但您需要明确提供 graph 的维度之一。所以你的 graph_algorithm 原型(prototype)会变成类似

void graph_algorithm(int proc_num, int numVertices, int graph[][numVertices])

关于C mmap() 共享内存写入在其他进程中看不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950204/

相关文章:

c++ - 在 gTest 中模拟 FreeRTOS 函数

c - 为什么我在这个简单的程序中得到随机垃圾值?

c - 如何将 mmap 传递给 C 中的 execve 函数?

Java:初始化数据结构一次并在 JVM 中重用(具有高延迟且无远程调用)

c++ - 如何将结构导出到文件,然后内存映射文件?

c - 是否有等效于倒带功能的功能,但仅适用于一个 token ?

C弦长

自定义内存区域的 c malloc 功能

c - 写入映射数据时出现总线错误

c - 阿尔萨 API : how to use mmap in c?