共享内存概念
共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备。但是它没有自带同步机制,需要配合信号量等方式来进行同步。
共享内存被创建以后,同一块物理内存被映射到了多个进程地址空间,当有一个进程修改了共享内存的数据,其余的进程均可看见所修改的内容,反之亦然。
mmap函数
函数原型:
- void mmap(void adrr, size_t length, int prot, int flags, int fd, off_t offset);
返回值:
具体参数含义:
mumap函数
函数原型:
- int munmap(void *addr, size_t length);
函数作用:
如同malloc之后需要free一样,mmap调用创建的映射区使用完毕之后,需要调用munmap去释放。
例程
写进程:
- #include <stdio.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- typedef struct
- {11 int id;
- char name[20];
- char gender;
- }stu;
- int main(int argc, char *argv[])
- {
- stu *p = NULL;
- int fd = 0;
- stu student = {10, "harry", 'm'};
- if (argc < 2) {
- printf("useage: ./a.out file\n");
- return -1;
- }
- fd = open(argv[1], O_RDWR | O_CREAT, 0664);
- if (fd == -1) {
- printf("ERROR: open failed!\n");
- return -1;
- }
- ftruncate(fd, sizeof(stu));
- p = mmap(NULL, sizeof(stu), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if (p == MAP_FAILED) {
- printf("ERROR: mmap failed!\n");
- return -1;
- }
- close(fd);
- while (1) {
- memcpy(p, &student, sizeof(stu));
- student.id++;
- sleep(2);
- }
- munmap(p, sizeof(stu));
- return 0;
- }
读进程:
- #include <stdio.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- typedef struct
- {
- int id;
- char name[20];
- char gender;
- }stu;
- int main(int argc, char *argv[])
- {
- stu *p = NULL;
- int fd = 0;
- if (argc < 2) {
- printf("useage: ./a.out file\n");
- return -1;
- }
- fd = open(argv[1], O_RDONLY);
- if (fd == -1) {
- printf("ERROR: open failed!\n");
- return -1;
- }
- p = mmap(NULL, sizeof(stu), PROT_READ, MAP_SHARED, fd, 0);
- if (p == MAP_FAILED) {
- printf("ERROR: mmap failed!\n");
- return -1;
- }
- close(fd);
- while (1) {
- printf("id = %d, name = %s, gender = %c\n", p->id, p->name, p->gender);
- sleep(2);
- }
- munmap(p, sizeof(stu));
- return 0;
- }
本文授权转载自公众号「良许Linux」。良许,世界500强外企Linux开发工程师,公众号里分享大量Linux干货,欢迎关注!
简单点说: 阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; ...
selenium基本使用之鼠标操作 ? 使用 ActionChains 类中提供的 方法 实现鼠标 点...
今天在Java中想使用正则表达式来获取一段文本中的任意字符。于是很随意得就写出...
首先提出一个问题: 如何取得一个给定的字符串substr在另一个字符串str中出现的...
随着物联网无线通信技术的日益发展 WiFi的网络覆盖范围大移动便捷。传输速度快安...
字符串操作是程序设计中最常见的行为Java语言中使用最广泛的字符串类是String类...
背景 我之前一直在寻找一个Web端的数据库管理工具,奈何找了很长时间,直到最近...
本文主要和大家分享一下redis的高级特性:bit位操作。 力求让大家彻底学会使用re...
字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用...
局部刷新页面、异步加载页面方案: 1.在jsp页面需要刷新的地方增加一个控件 div ...