shm_open、ftruncate、およびmmapを使用して、動的に作成された2次元配列を共有メモリに格納しています。配列を更新すると、その更新はその更新を行ったプロセスでのみ表示され、その共有メモリマッピングを使用している他のプロセスは表示されません。さらに苦労することなく-コード(関連ビット):
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_num0のプロセスはgraph[0] [0]で1になりますが、他のすべてのプロセスは古い値0を維持します。フォークとmmapのエラーチェックを省略しましたが、これが要点です。問題の。また、graph [0] [0] = 1の後でmsync(graph、sizeof(int)* numVertices * numVertices、MS_SYNC)を呼び出してみましたが、役に立ちませんでした。共有メモリを使用するのはこれが初めてで、何が間違っているのかわかりません。この問題は、私が見た限りでは、ここや他のサイトでは発生していません。どんな助けでも大歓迎です。