mmap实现进程间通信(父子进程、非父子进程)

        目录

1、非父子进程间通信

2、父子间进程通信


1、非父子进程间通信

假设现在有两个毫无关联的进程A、B,要让这两个进程进行通信,其实就是让这两个进程跟同一个文件建立映射。相当于一个进程在向文件写内容,一个进程在从文件读内容。

(1) 进程 mmap_w:负责写文件

我们让进程mmap_w 每隔 1s向映射空间中写入一个字节。

int main(){
	int fd = open("./log.txt", O_RDWR);
	if(fd < 0)
	{
		perror("open");
		return -1;
	}

	int len = lseek(fd, 0, SEEK_END);
	void* addr = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
	if(addr == MAP_FAILED)
	{
		perror("mmap");
		return -1;
	}
	close(fd);

	int i = 0;
	while(1){
		memcpy(addr + i, "a", 1);    // 每隔1s向 addr + i 的位置写入一个字节
		i++;
		sleep(1);
	}

    munmap(addr, len);        // 释放映射
}

(2) 进程mmap_r:负责读文件

该进程每隔1s就打印映射空间里的内容。

int main(){
	int fd = open("./log.txt", O_RDWR);
	if(fd < 0)
	{
		perror("open");
		return -1;
	}

	int len = lseek(fd, 0, SEEK_END);
	void* addr = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
	if(addr == MAP_FAILED)
	{
		perror("mmap");
		return -1;
	}
	close(fd);

	while(1){
		printf("%s\n", (char*)addr);        // 打印内存映射空间的内容
		sleep(1);
	}
    munmap(addr, len);        // 释放映射
}

2、父子间进程通信

mmap 的第四个参数flags,可以设置为匿名映射(MAP_ANONYMOUS),此时就可以实现父子间进程通信了。下面我们让父进程写入一串字符,子进程读取这串字符。

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>

int main(){
	int fd = open("./log.txt", O_RDWR);
	if(fd < 0)
	{
		perror("open");
		return -1;
	}

	int len = lseek(fd, 0, SEEK_END);
	void* addr = mmap(NULL, len, PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, fd, 0);
	if(addr == MAP_FAILED)
	{
		perror("mmap");
		return -1;
	}
	close(fd);

	pid_t pid = fork();
	if(pid < 0)
	{
		perror("fork");
		return -1;
	}
	else if(pid > 0) 
	{
		// 父进程
		const char* str = "hello, world";
		memcpy(addr, str, strlen(str));

		wait(NULL);
	}
	else
	{
		// 子进程
		sleep(1);  // 因为不知道谁先执行完,这么做可以保证父进程先写,子进程后读
		printf("%s\n",(char*)addr);
	}
}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值