c - 共享内存不更新
问题描述
所以我一直在尝试更多地了解共享内存。我正在我的主人中创建一个共享内存结构并分叉孩子。然后每个孩子都使用 execv 创建一个新进程。当我尝试从新进程更改共享内存的值时,父进程看不到该更改。我也期待父母将执行与孩子交错。例如
Child 1 exec
parent
child 2 exec
parent
child 3 exec
parent
但相反,我得到
child 1 exec
child 2 exec
child 3 exec
parent
parent
parent
这是我的代码
模拟.c
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <time.h>
# include <stdlib.h>
# include <dirent.h>
# include <stdio.h>
# include <string.h>
# include <getopt.h>
# include <stdbool.h>
# include <ctype.h>
# include <sys/wait.h>
# include <signal.h>
# include <sys/mman.h>
# include <sys/time.h>
# include <stdint.h>
# include <fcntl.h>
# include <sys/shm.h>
struct sharedregion{
volatile int seconds;
volatile int sharedmsg;
};
struct sharedregion *mystruct;
void spawnchild()
{
int fd = shm_open("sharedmemory", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRWXG | S_IRWXU);
if (fd == -1)
perror("Error in opening");
if (ftruncate(fd, sizeof(struct sharedregion)) == -1)
perror("Unable to truncate");
mystruct = mmap(NULL, sizeof(struct sharedregion),PROT_READ | PROT_WRITE, MAP_SHARED| MAP_ANONYMOUS, fd, 0);
if (mystruct == MAP_FAILED)
perror("mapping failed");
mystruct->seconds=0;
mystruct->sharedmsg=0;
int i;
for(i=0;i<4;i++)
{
pid_t pID = fork();
if (pID == 0)
{
static char *args[]={"./child",NULL};
execv(args[0], args);
perror("failed to execv");
exit(EXIT_FAILURE);
}
else if (pID < 0) // failed to fork
{
perror(" Failed to fork:");
exit(EXIT_FAILURE);
}
else if(pID>0)
{
printf("\nfrom parent= %d",mystruct->sharedmsg);
mystruct->seconds=mystruct->seconds+1;
if(mystruct->seconds==1000000000)
{
mystruct->seconds=1;
}
}
}
}
int main(int argc, char **argv)
{
spawnchild();
}
孩子.c
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <time.h>
# include <stdlib.h>
# include <dirent.h>
# include <stdio.h>
# include <string.h>
# include <getopt.h>
# include <stdbool.h>
# include <ctype.h>
# include <sys/wait.h>
# include <signal.h>
# include <sys/mman.h>
# include <sys/time.h>
# include <stdint.h>
# include <fcntl.h>
# include <sys/shm.h>
struct sharedregion{
volatile int seconds;
volatile int sharedmsg;
};
struct sharedregion *mystruct;
int main(int argc, char **argv)
{
int memFd = shm_open("sharedmemory", O_RDWR, S_IRUSR | S_IWUSR | S_IRWXG | S_IRWXU);
if (memFd == -1)
{
perror("Can't open file");
return 1;
}
mystruct = mmap(NULL, sizeof (struct sharedregion), PROT_READ | PROT_WRITE, MAP_SHARED| MAP_ANONYMOUS, memFd, 0);
printf("\nhello from exec");
mystruct->sharedmsg=8;
printf("buffer %d",mystruct->sharedmsg);
return 0;
}
我的输出
hello from execbuffer 8
hello from execbuffer 8
hello from execbuffer 8
hello from execbuffer 8
hello from execbuffer 8
from parent= 0
from parent= 0
from parent= 0
from parent= 0
from parent= 0
解决方案
删除标志 MAP_ANONYMOUS
根据手册:
MAP_ANONYMOUS [...] fd 参数被忽略;
因此它忽略了您的共享内存
推荐阅读
- ssl - 自动重定向到 https
- html - Jstree - 如何正确放置在模板上
- php - PHP 正则表达式 - 无法匹配。变量有 '\r\n'
- rest - 通过 REST API 从 Google Fit 获取所有跑步活动
- html - CSS Grid 根据内容将行推到顶部
- c# - 订阅事件时无法创建用户控件的实例
- python - 对 pandas 数据框中的元素进行排名
- python - Python 无法读取最新的 Outlook 附件,只能读取较旧的附件
- c - 将连续除法的其余部分存储在数组中
- javascript - io.sockets.in(room).emit() 不工作