c - 尝试使用子进程写入共享内存中的 int(使用 mmap)

标签 c mmap

我正在研究一些需要在父进程和 fork 的子进程之间进行通信的代码。我在 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 有点陌生。我花了几个小时试图弄清楚这个问题,并阅读了几十页,这些页面说它应该是一个简单的过程。老实说,这对我的自尊心是一个沉重的打击 :) 。我确定我只是遗漏了一些小细节 - 有人可以向我指出吗?提前感谢您的宝贵时间。

最佳答案

您的问题是传递给 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 man page如果您还没有找到它,可能会对您有所帮助。

关于c - 尝试使用子进程写入共享内存中的 int(使用 mmap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672778/

相关文章:

c - 如何正确地将 C 结构写入磁盘上的文件,以便可以在其上使用 mmap?

c++ - 我们如何使用动态规划解决子串匹配检查

c - Linux 中 MMAP 值的生命周期

c++ - valgrind memcheck 是否支持检查 mmap

c - 尝试返回 char 指针时出现奇怪的输出

c - mmap 是否与所有进程共享内存?

pointers - 将指针转换为 byte slice

php - 使用 PHP 在服务器上编译 C 代码

c - (生命游戏)如何在不检查矩阵外部的情况下循环遍历矩阵的外层,同时检查邻居?

c - 如何将 4 个字节/整数保存为 Short?