1.mmap父子进程通信
\qquad
父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信。但相应的要在创建映射区时候指定对应的标志位参数flags:
\qquad
MAP_PRIVATE
:父子进程各自独占映射区;MAP_SHARED
:父子进程共享映射区。
2.mmap匿名通信
\qquad 所谓mmap匿名通信就是不借助中间文件创建mmap映射区。
3.举例
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/mman.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
//1.创建父子共享映射区
int* p;
p = mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0);
if(p==MAP_FAILED){
perror("mmap fail!");
exit(1);
}
//2.创建子进程
int fork_fd;
fork_fd = fork();
if(fork_fd==-1){
perror("fork fail!");
exit(1);
}
else if(fork_fd==0){
printf("子进程已经被创建!\n");
*p = 1000;
printf("i am child,*p=%d\n",*p);
}
else if(fork_fd>0){
sleep(2);
int wait_fd;
wait_fd = wait(NULL);
if(wait_fd==-1){
perror("wait fail!");
exit(1);
}
printf("父进程已经被创建!\n");
printf("i am parent,*p=%d\n",*p);
}
//3.关闭映射区
int close_fd;
close_fd = munmap(p,100);
if(close_fd==-1){
perror("munmap fail!");
exit(1);
}
return 0;
}