Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试使用子进程写入共享内存中的int(使用mmap)_C_Mmap - Fatal编程技术网

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

C 尝试使用子进程写入共享内存中的int(使用mmap),c,mmap,C,Mmap,我正在处理一些需要父进程和分叉子进程之间通信的代码。在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){

我正在处理一些需要父进程和分叉子进程之间通信的代码。在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);
尽管子进程将“共享”的值设置为1,但此程序输出0

在我的实际程序中,将共享一个struct而不是int,但是如果我能理解这个代码片段,我认为其余的应该都能理解


我绝对不是一个有经验的程序员,而且我对C有点不熟悉。我花了几个小时试图弄明白这一点,并且读了几十页,上面说这应该是一个简单的过程。老实说,这对我的自尊是一个沉重的打击:)。我肯定我只是遗漏了一些小细节——有人能告诉我吗?提前感谢您的时间。

您的问题是将标志传递到
mmap()
,您希望
MAP\u共享

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);
}

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

此外,MAP_ANONYMOUS不是POSIX定义的,在某些系统(如Mac OS X)上不可用。是的,就是这样。我在mmap手册页上读了十几遍——不知道怎么会错过。非常感谢你。
0
1
1