У меня два дочерних процесса (оба имеют одного и того же родителя), запущенных с помощью системного вызова 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;
}