我正在玩一些需要在父进程和分叉子进程之间进行通信的代码.我在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);
Run Code Online (Sandbox Code Playgroud)
虽然子进程将'shared'的值设置为1,但此程序输出0.
在我的实际程序中,将共享一个结构而不是一个int,但如果我能弄清楚这个代码片段,我认为其余部分应该落实到位.
我不是一个经验丰富的程序员,而且我对C有点不熟悉.我花了好几个小时试图解决这个问题并阅读了几十页,说这应该是一个简单的过程.说实话,这对我的自尊心是一个沉重的打击:).我确定我只是错过了一些细节 - 有人能指出我吗?在此先感谢您的时间.
你的问题是mmap()你想要传递的标志MAP_SHARED.
int * shared = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
Run Code Online (Sandbox Code Playgroud)
使用下面的代码按预期工作
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
1
1
Run Code Online (Sandbox Code Playgroud)
如果您还没有找到它,mmap手册页可能对您有所帮助.