gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:02 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com