7

我正在玩一些需要在父进程和分叉子进程之间进行通信的代码。我在 fork 之前在共享内存中创建了一个 int,但是当父进程访问时,我对子进程所做的任何更改似乎都不会影响 int。这是一段代码,说明了我的问题。

int * shared = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 
pid_t child;
int childstate;
if((child=fork())==0){
      *shared = 1;
      exit(0);
}
waitpid (child, &childstate, 0); 
printf("%d",*shared);

尽管子进程将 'shared' 的值设置为 1,但该程序输出 0。

在我的实际程序中,将共享一个结构而不是一个 int,但如果我能弄清楚这个代码片段,我认为其余的应该就位。

我绝不是一个经验丰富的程序员,而且我对 C 有点不熟悉。我花了几个小时试图弄清楚这一点,并阅读了几十页说这应该是一个简单的过程。老实说,这对我的自尊心是一个沉重的打击:)。我确定我只是遗漏了一些小细节-有人可以向我指出吗?在此先感谢您的时间。

4

1 回答 1

11

你的问题是传入的标志mmap(),你想要MAP_SHARED的。

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

使用下面的代码按预期工作

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>

int main(void) {
    int * shared = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 
    pid_t child;
    int childstate;
    printf("%d\n", *shared);
    if((child=fork())==0){
            *shared = 1;
            printf("%d\n", *shared);
            exit(0);
    }
    waitpid (child, &childstate, 0); 
    printf("%d\n",*shared);
}

输出:

0
1
1

如果您还没有找到mmap 手册页,可能会对您有所帮助。

于 2013-10-30T04:11:38.070 回答