linux共享存储通信实验,Linux进程通信——共享存储
共享内存是进程间通信最有用的方式,也是最快的IPC形式。共享内存是说:同一块内存被映射到多个进程的地址空间。但是共享内存并不提供同步机制,因此需要互斥锁或者信号量。使用共享内存唯一需要注意的是:当前如果有进程正在向共享内存写数据,则在写入完成以前,别的进程不应当去读、写共享内存。
共享内存最大的优点就是快。由system V演变而来的内存共享相关函数。目前Linux对system V的共享内存方式支持的比较好。在高版本的Linux内核上,我们有更多的方式来完成共享存储。嵌入式开发板搭载的低版本内核的Linux操作系统基本上都是不支持POSIX标准的内存共享的,只能使用system V的内存共享方式。system V是通过映射特殊文件系统shm中的文件实现内存共享的。通过shmget获得或者创建一个IPC共享内存,并返回这块内存相应的标识符。同时会初始化内核维护的一个数据结构shmid_kernel.当然还会在shm文件系统之中创建一个不属于任何进程的文件。shmid_kernel这个结构体之中的最重要的一个区域是shm_file。它存储被映射文件的地址。
跑题了,本文将介绍mmap存储映射的方式完成的进程间通信。一种方式是使用dev目录下的特殊文件zero。
该文件是一个字符设备文件,该设备是0字节的无限资源。1,5是该设备的主从设备号,不是大小。
zero接收写向他的任何数据,但是会忽略掉这些信息。当对zero进行存储映射的时候,它具备一下性质。
创建一个未命名的存储区,大小事mmap的第二个参数。
存储区被初始化为0。
如果多个进程的公共祖先对mmap指定了MAP_SHARED标志,则这些进程共享此存储区。
一个简单的例子如下。
#include
#include
#include
#include
#include
#include
#include
int main()
{
int num = 7777777;
int fd = open("/dev/zero",O_RDWR);
if (-1 == fd)
{
perror("open zero fail");
exit(1);
}
int *p = mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if (MAP_FAILED == p)
{
perror("mmap fail");
exit(1);
}
close(fd);
pid_t pid = fork();
if (0 == pid)
{
num = 233;
*p = 666;
}
if (0 < pid)
{
wait(NULL);
printf("*p = %d\n",*p);
printf("num = %d\n",num);
}
if (-1 == pid)
{
perror("fork fail");
exit(1);
}
return 0;
}
在子进程中更改了存储映射区域的值为666,也更改了num变量的值。让子进程先运行,父进程后运行,打印输出的结果如下。
对于存储映射区域,父子进程是共享的;对于变量,父子进程是独立的。 使用zero文件的优点是mmap函数的第二个参数len可以指定任意长度,而无需关心zero文件的大小。
Linux除了使用zero以外,它还提供了一种称为匿名映射的方式。这种方式需要在使用mmap的时候指定MAP——ANON标志,并将文件描述符设置为-1。更改上面的程序如下。
#include
#include
#include
#include
#include
#include
#include
int main()
{
int num = 7777777;
//注意这行代码和上面程序中的不同之处
int *p = mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,-1,0);
if (MAP_FAILED == p)
{
perror("mmap fail");
exit(1);
}
//close(fd);
pid_t pid = fork();
if (0 == pid)
{
num = 233;
*p = 666;
}
if (0 < pid)
{
wait(NULL);
printf("*p = %d\n",*p);
printf("num = %d\n",num);
}
if (-1 == pid)
{
perror("fork fail");
exit(1);
}
return 0;
}
运行结果是一致的。
本文同步分享在 博客“zy010101”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
linux共享存储通信实验,Linux进程通信——共享存储相关推荐
- 2020 操作系统 实验二 进程通信
实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...
- linux进程间的通信实验,linux实验进程之间的通信.doc
院 系: 计算机学院 实验课程:linux内核设计与实现 实验项目:进程之间的通信 指导老师:冯刚 开课时间: 2010 - 2011 年度第 2 学期 专 业:计算机科学与技术(师范) 班 级:2班 ...
- 操作系统——实验贰——进程通信(一)管道及共享内存
一. 实验目的 熟悉并掌握管道机制,并实现进程间通信 熟悉并掌握共享内存机制,并实现进程间通信 二. 实验内容 任务一: (1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析 ...
- linux进程通信1:进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战
进程通信概述,管道通信原理(无名管道,有名管道),管道编程实战 1.进程间通信概述: 举例1: 你手机微信和别人手机微信通信 举例2: 如:父子进程wait 和 exit之间的通信 进程间通信(IPC ...
- ZUCC_操作系统实验_Lab7进程通信---共享内存
lab7进程通信-共享内存 一.利用共享内存实现生产者/消费者问题的解决方案 1.代码 #include<stdio.h> #include<stdlib.h> #includ ...
- Linux——(管道练习)C实现父子进程通信、兄弟进程通信、多个读写端操作管道及管道缓冲区大小、fifo实现非血缘间进程通信
一. 父子进程通信 lswc-l 父进程ls写到管道,子进程wc管道的内容 父进程创建管道(拥有读写两端),父进程fork子进程,父进程要将原本输出到屏幕上的内容输出到管道中,用dup实现,然后exe ...
- 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品
<实验2 进程控制与通信管理word文档良心出品>由会员分享,可在线阅读,更多相关<实验2 进程控制与通信管理word文档良心出品(13页珍藏版)>请在人人文库网上搜索. 1. ...
- 【通信】网络通信 进程通信 同步异步通信
通信 网络通信 三次握手 四次挥手 为什么TCP连接需要三次握手,两次不可以吗?为什么? TCP连接的特点 TCP流量控制-滑动窗口 TCP拥塞控制 TCP与UDP的区别 进程和线程的区别 进程间通信 ...
- Linux系统无名管道通信实验,Linux进程间通信(二)---管道通信之无名管道及其基础实验...
管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节主要讲 ...
最新文章
- Redis 配置文件介绍——redis.conf
- 通用AI咋发展?向大脑学习是条路子
- 每日一皮:原型还可以啊,怎么上线后就这样了。。。
- Codeforces Round #496 (Div. 3)【未完结】
- 前端常见知识点二之浏览器
- 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
- vscode正则表达式替换php数组,vscode正则替换
- java gsoap_gsoap c与java web之间传输字符串中文乱码问题 | 学步园
- asp.net core 实战之 redis 负载均衡和quot;高可用quot;实现
- cg word List 3
- java多线程activemq,多线程JMS客户端ActiveMQ
- Debian for ARM install python 3.5.x
- 【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类
- 0.05‱的人生赢家!我们昨天仰视的学霸,今天又成了千亿富豪!
- 【UV打印机】RYPC打印软件教程(一)-软件简介
- fastdfs 原理与过程
- python字符串输入小圆点_第6章 多序列比对
- 贪心科技机器学习训练营(五)
- 一:【博客分享】优秀的有趣的博客
- osu计算机科学硕士,OSU的Computer Science and Engineering「俄亥俄州立大学计算机科学与工程系」...