c-使用mmap使int数组对子进程可见



我正在处理用餐哲学家的问题,不能使用线程,所以我需要使用共享内存,使筷子和哲学家的阵列对所有子进程可见。我正在尝试使用mmap,然而,我对mmap的使用是不正确的,我不确定如何修复它,因为根据这个问题,我的论点是int数组,而不是int。我应该使用一个不同的函数来在共享内存中创建它吗?

(declared at the global scope)
int chopsticks[5];
int sizeOfSticks=sizeof(int)*5;
void* map = mmap(0,sizeOfSticks,PROT_READ|PROT_WRITE, MAP_SHARED,chopsticks,0);

mmap()倒数第二个参数是文件描述符,用于将文件映射到内存的情况。如果你只需要分配一些共享内存,那么就这样做:

int *chopsticks;
...
chopsticks = mmap(NULL, N_CHOPSTICKS*sizeof(int),
                  PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED,
                  -1, 0);

MAP_ANONYMOUS表示映射没有对应的文件。为fd传递0可能也可行,但-1可能更具可移植性(例如,请参阅Linux上的mmap(2)手册页)。

映射将由fork(2)'d子进程继承。

作为一个小风格的旁注,您可以编写N_CHOPSTICKS*sizeof(*chopsticks)而不是N_CHOPSTICKS*sizeof(int)。这样,即使您更改了chopsticks的类型,大小仍然是正确的。

最新更新