如何在属于同一父级的两个子进程之间共享内存

时间:2018-09-27 18:04:33

标签: c linux fork exec mmap

我有两个通过exec()系统调用启动的子进程(都具有相同的父进程),我希望这两个进程通过mmap()映射到IPC的相同文件。我遇到的问题是,一个进程使用mmap()返回的指针写入数据(它自己的pid),但是另一个进程无法读取该数据。我也希望第二个子进程使用该pid来了解第一个子进程的状态。任何帮助将不胜感激,因为我对此还很陌生。

父流程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char **argv)
{ 
pid_t process, f_child, s_child;
int status;
sem_t synch; 
sem_init(&synch, 1, 0);
process = fork();
if(process<0)
{
perror("Fork Failed");
exit(1);
}
if(process>)
{
//Parent!!
sem_post(&synch); // signaling to child
f_child = wait(&status);
s_child = fork();
if(s_child==0)
{
//Second Child Process!!
execlp("./secondChild", "./secondChild", NULL);
}
}
else
{
//First Child Process!!
sem_wait(&synch);
execlp("./firstChild","./firstChild", NULL);
}
 return 0;
}

第一个子进程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd = shm_open("./myFile", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
int *sharedMem = mmap(0, 256, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, fd, 0);


*sharedMem = getpid();
printf("Child Process 1 wrote message : %d", *sharedMem);
exit(10);
return 0;
}

第二子进程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd = shm_open("./myFile", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
int *sharedMem = mmap(0, 256, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, fd, 0);


printf("Child Process 2 readmessage : %d", *sharedMem);
return 0;
}

2 个答案:

答案 0 :(得分:1)

MAP_ANONYMOUS请求匿名内存,即不独立于任何文件的内存,并且mmap的fd参数将被忽略。删除它。

答案 1 :(得分:0)

如果您在linux上运行sem_init(至少在我的系统上),它说sem_t必须位于共享内存位置;父进程的堆栈不是共享内存区域。该手册在这方面有点含糊不清,因为它继续说叉的孩子继承了这些映射,但是我很确定这意味着叉的孩子继承了共享的映射。