Как разделить память между двумя дочерними процессами, принадлежащими одному и тому же родителю - PullRequest
0 голосов
/ 27 сентября 2018

У меня два дочерних процесса (оба имеют одного и того же родителя), запущенных с помощью системного вызова exec(), и я хочу, чтобы эти два процесса сопоставились с одним и тем же файлом для IPC через mmap().У меня проблема в том, что один процесс записывает данные (это собственный pid), используя указатель, возвращаемый mmap(), но другой процесс не может прочитать эти данные.Также я хочу, чтобы второй дочерний процесс использовал этот 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 голосов
/ 01 октября 2018

MAP_ANONYMOUS запрашивает анонимную память, то есть память, которая не зависит от какого-либо файла, а аргумент fd для mmap игнорируется.Удалить его.

0 голосов
/ 27 сентября 2018

Если вы используете sem_init в linux (по крайней мере, в моем), это говорит о том, что sem_t должен находиться в общей памяти;стек родительского процесса не является областью общей памяти.Руководство немного двусмысленно в этом отношении, так как далее говорится, что разветвленный ребенок наследует эти сопоставления, но я почти уверен, что это означает, что разветвленный ребенок наследует общие сопоставления.

...