//
// Created by wyy on 2024/4/10.
//
/*
* 1. Memory-mapped IO
* 存储映射:将磁盘的东西映射到内存
*
* */
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/wait.h>
int var=100;
//int main() {
//
// int fd = open("/root/testmmap", O_RDWR|O_CREAT|O_TRUNC, 0666);
// unlink("/root/testmmap");
// if (fd == -1) {
// perror("open error");
// }
//
// ftruncate(fd, 10);
// int *p = mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
// close(fd);
//
// pid_t pid = fork();
// if (pid == 0) {
// sleep(1);
// printf("child before, *p=%d, var=%d\n", *p, var);
// *p = 1000;
// var = 1000;
// printf("child after, *p=%d, var=%d\n", *p, var);
// } else {
// wait(NULL);
// printf("parent, *p=%d, var=%d\n", *p, var); // 读共享内存
//
// int ret = munmap(p, 10);
// if (ret == -1) {
// perror("munmap error");
// exit(1);
// }
// }
// return 0;
//
//}
//int main() {
// // 匿名映射
// int *p = mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
// pid_t pid = fork();
// if (pid == 0) {
// sleep(1);
// printf("child before, *p=%d, var=%d\n", *p, var);
// *p = 1000;
// var = 1000;
// printf("child after, *p=%d, var=%d\n", *p, var);
// } else {
// wait(NULL);
// printf("parent, *p=%d, var=%d\n", *p, var); // 读共享内存
//
// int ret = munmap(p, 10);
// if (ret == -1) {
// perror("munmap error");
// exit(1);
// }
// }
// return 0;
//
//}
int main() {
/*
* /dev/zero:想读多少读多少
* /dev/null:想写多少写多少
*
* */
int fd = open("/dev/zero", O_RDWR);
int *p = mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
pid_t pid = fork();
if (pid == 0) {
sleep(1);
printf("child before, *p=%d, var=%d\n", *p, var);
*p = 1000;
var = 1000;
printf("child after, *p=%d, var=%d\n", *p, var);
} else {
wait(NULL);
printf("parent, *p=%d, var=%d\n", *p, var); // 读共享内存
int ret = munmap(p, 10);
if (ret == -1) {
perror("munmap error");
exit(1);
}
}
return 0;
}
mmap进程间通信举例
最新推荐文章于 2024-07-25 12:46:10 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)