【发布时间】:2019-03-03 17:00:38
【问题描述】:
我有两个使用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;
}
【问题讨论】:
-
我建议您首先向您的“子”进程添加一些错误检查。他们的
shm_open电话真的成功了吗?mmap电话怎么样? -
@Someprogrammerdude 我对
shm_open()和mmap()调用都进行了错误检查。还是不行。。