我正在研究餐饮哲学家的问题并且不能使用线程,因此我需要使用共享内存来使筷子和哲学家的数组对所有子进程可见。我试图使用mmap,但是,我对mmap的使用是不正确的,我不确定如何解决它,因为我的参数是一个int数组而不是int question。我应该使用不同的功能在共享内存中创建吗?
(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);
答案 0 :(得分:2)
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)
。这样,即使您更改chopsticks
的类型,大小仍然是正确的。