2

我正在研究餐饮哲学家的问题,并且不能使用线程,所以我需要使用共享内存来使筷子和哲学家的数组对所有子进程可见。我正在尝试使用 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);
4

1 回答 1

3

倒数第二个参数mmap()是文件描述符,用于将文件映射到内存的情况。如果您只需要分配一些共享内存,请改为执行以下操作:

int *chopsticks;

...

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

MAP_ANONYMOUS表示映射没有对应的文件。传递 0fd也可能有效,但 -1 可能更便携(参见例如mmap(2)Linux 上的手册页)。

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

作为一个小风格的旁注,你可以写N_CHOPSTICKS*sizeof(*chopsticks)而不是N_CHOPSTICKS*sizeof(int). 这样,即使您更改chopsticks.

于 2015-03-24T23:46:49.883 回答