我正在研究餐饮哲学家的问题,不能使用线程,所以我需要使用共享内存,使筷子和哲学家的阵列对所有的孩子进程可见我正在尝试使用mmap,但是,我对mmap的使用是不正确的,并且我不确定如何修复它,因为我的参数是一个int数组,而不是这个question中的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)而不是N_CHOPSTICKS*sizeof(*chopsticks)这样即使您更改N_CHOPSTICKS*sizeof(int)的类型,大小仍然正确。

10-06 05:53