实质上mmap是内核借助文件帮我们创建了一个映射区,多个进程之间利用该映射区完成数据传递。由于内核空间多进程共享,因此无血缘关系的进程间也可以使用mmap来完成通信。只要设置相应的标志位参数flags即可。若想实现共享,当然应该使用MAP_SHARED了。

// mmap_w.c      

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>struct STU {int id;char name[20];char sex;
};void sys_err(char *str)
{perror(str);exit(1);
}int main(int argc, char *argv[])
{int fd;struct STU student = {10, "xiaoming", 'm'};struct STU *mm;if (argc < 2) {printf("./a.out file_shared\n");exit(-1);}fd = open(argv[1], O_RDWR | O_CREAT, 0664);ftruncate(fd, sizeof(student));mm = mmap(NULL, sizeof(student), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (mm == MAP_FAILED)sys_err("mmap");close(fd);while (1) {memcpy(mm, &student, sizeof(student));student.id++;sleep(1);}munmap(mm, sizeof(student));return 0;
}

// mmap_r.c

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>struct STU {int id;char name[20];char sex;
};void sys_err(char *str)
{perror(str);exit(-1);
}int main(int argc, char *argv[])
{int fd;struct STU student;struct STU *mm;if (argc < 2) {printf("./a.out file_shared\n");exit(-1);}fd = open(argv[1], O_RDONLY);if (fd == -1)sys_err("open error");mm = mmap(NULL, sizeof(student), PROT_READ, MAP_SHARED, fd, 0);if (mm == MAP_FAILED)sys_err("mmap error");close(fd);while (1) {printf("id=%d\tname=%s\t%c\n", mm->id, mm->name, mm->sex);sleep(2);}munmap(mm, sizeof(student));return 0;
}

结论:该方式与利用文件进行通信的方式相似,只是mmap更加简单。只要映射的是同一个文件,且采用MAP_SHARED参数即可,这样共享映射的空间。

strace命令。 strace ./test  追踪可执行文件test在程序执行过程中使用了哪些系统调用。

mmap无血缘关系进程间通信相关推荐

  1. Linux 无血缘关系进程通信

    实质上mmap是内核借助文件帮我们创建了一个映射区,多个进程之间利用该映射区完成数据传递,由于内核空间多进程共享,因此无血缘关系的进程之间,也可以使用mmap来进行通信,只要设置相应的标记位flag即 ...

  2. linux之通过一个文件实现非血缘关系进程间通信

    原理:打开的文件是内核中的一块缓冲区.多个无血缘关系的进程,可以同时访问该文件. test1.c与test2.c实现了通过一个文件 完成两个非血缘关系进程之间的通信 代码:test1.c #inclu ...

  3. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

    共享存储映射 文件进程间通信 使用文件也可以完成 IPC,理论依据是,fork 后,父子进程共享文件描述符.也就共享打开的文件. 编程:父子进程共享打开的文件.借助文件进行进程间通信. 测试代码 /* ...

  4. Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)

    文章目录 编程环境: 进程间通信 IPC: 匿名管道(pipe): 父子进程间通信: 兄弟子进程间通信: 管道的读写行为: 读操作: 写操作: 查看管道缓冲区大小: 设置管道的非阻塞属性: 下载地址: ...

  5. Spark—RDD依赖血缘关系

    文章目录 Spark-RDD依赖&血缘关系 1.RDD 血缘关系 2.RDD 依赖关系 3.窄依赖 4.宽依赖 5.宽窄依赖示意图 6.RDD 阶段划分 7.RDD 任务划分 Spark-RD ...

  6. 数据治理(一)自研血缘关系

    数据治理(一)血缘关系 一.概念 数据血缘也称为数据血统或谱系,是来描述数据的来源和派生关系.数据来源是数据科学的关键,也是被公认为数据信任的核心的部分.说白了就是这个数据是怎么来的,经过了哪些过程或 ...

  7. 图像溯源,图血缘关系总结

    图像溯源总结 1.引言 2.处理方式 2.1 溯源图集过滤 2.1.1 局部特征提取 ① 特征点提取算法 1)SIFT(Scale Invariant Feature Transform,尺度不变特征 ...

  8. python实现之数据血缘关系,by networkx

    最近在进行数据逆向分析,无业务无界面无数据库的情况下,想通过对存储过程中关于输出输入表的分析快速了解业务的核心问题,然后再对核心业务进行逆向回溯. 其实问题很简单,一个存储过程会有多个输入表和输出表, ...

  9. 数据治理展示血缘关系的工具_Nebula Graph 在微众银行数据治理业务的实践

    本文为微众银行大数据平台:周可在 nMeetup 深圳场的演讲这里文字稿,演讲视频参见:B站 自我介绍下,我是微众银行大数据平台的工程师:周可,今天给大家分享一下 Nebula Graph 在微众银行 ...

最新文章

  1. vivado开发编译流程
  2. windows下多tomcat部署
  3. 德国布线牛到不行?今天带你看看咱们中国的!
  4. 生信老司机以中心法则为主线讲解组学技术的应用和生信分析心得—限时免费
  5. mysql拒绝远程连接_解决Mysql数据库拒绝远程连接和忘记密码的问题
  6. 我晕,原来是这个问题!
  7. Xmanager注册码激活教程
  8. 【实习之T100开发】帆软报表笔记
  9. JAVA JSP学生助学金管理系统 jsp学生资助管理系统jsp学生管理系统jsp贷款管理系统jsp大学生贷款管理系统
  10. vm虚拟机怎么访问本地硬盘
  11. 波士顿动力Spot mini,MIT 猎豹、宇树科技、蔚蓝四足机器人类别
  12. 图像处理中关于矩的解释
  13. 查看office2016是不是永久激活状态
  14. 激光位移传感器与其他位移传感器比较
  15. 输出三位数的个十百位数
  16. 移动电影院新版本新功能新体验
  17. linux下实现线程暂停
  18. win7系统如何设置远程桌面连接【系统天地】
  19. TOOLS——SecureCRT8.5的下载、安装、注册、连接、用到的配置以及可能遇到的错误、常用快捷键
  20. CSS第三级选择器 Selectors Level 3 文档翻译

热门文章

  1. lr_start_timer,lr_get_transaction_duration,lr_get_transaction_wasted_time函数使用总结
  2. 装修月记第一弹,硬装篇
  3. java memcache 队列_基于memcache的java分布式队列实现。
  4. 28岁学python转行_28岁转行程序员,学Java还是Python?码农:想快点月薪过万就选它...
  5. 力扣498. 对角线遍历
  6. 160 - 35 cupofcoffe.1
  7. 【C++基础】C++11的noexcept声明符 与 异常传播
  8. 【C++grammar】结构化绑定
  9. leetcode 39. 组合总和 思考分析
  10. weakhashmap_Java WeakHashMap values()方法与示例