使用 mmap 使 int 数组对子进程可见
Making an array of ints visible to child processes using mmap
我正在研究哲学家用餐问题,不能使用线程,所以我需要使用共享内存让筷子和哲学家数组对所有子进程可见。我正在尝试使用 mmap,但是,我对 mmap 的使用不正确,而且我不确定如何修复它,因为我的参数是一个整数数组,而不是这个 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);
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
.
的类型,大小仍然是正确的
我正在研究哲学家用餐问题,不能使用线程,所以我需要使用共享内存让筷子和哲学家数组对所有子进程可见。我正在尝试使用 mmap,但是,我对 mmap 的使用不正确,而且我不确定如何修复它,因为我的参数是一个整数数组,而不是这个 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);
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
.