Linux 基于IPC机制实现进程间的共享内存处理
今天学习了相关于IPC(InterProcess Communication ,进程间通信)的相关知识。就做个笔记,一来让大家检查一下我的理解方面是不是有错误,二来也为了能让更多的博友们了解到相关的知识吧。
IPC的种类
IPC 的种类,一般来说下面两种使用的较多:
- 共享“内存”
- 消息传递
下来我们就分别的介绍一下相关的信息吧。
共享内存
字面意思的理解是采用共享一块计算机中的内存空间来实现的进程之间的通信的一种方式。也就是说这块内存区域驻留在生成共享内存段进程的地址空间。(是存在于用户态内核的区域的)其他进程通过对此块空间的数据进行读写操作来完成相应的通信所需。
好处:进程的通信会非常的快;
缺点:由于不同进程可以对这块共享内存进行操作,就有可能导致数据的读写冲突,或者得到的数据有可能会不一致!
下面是一个实现了进程之间通过共享内存的方式实现进程通信的一个小例子:
首先我们先普及一下相关的函数的具体的细节:
前提是记得引入相关的头文件哦(代码中已标出)
//通过系统调用获得一个共享内存区域
shmget(IPC_PRIVATE, //生成一个新的共享内存片段
size, //共享内存区的大小
S_IRUSR | S_IWUSR //读写操作共享内存区
); int //该函数返回一个整形值
//通过系统调用将要访问内存空间的进程加入到共享内存空间的地址
shmat(
id, //希望加入的内存片段的整数标识值
NULL, //NULL代表操作系统为用户选择共享内存位置
0 //0代表可以对共享内存进行读和写的操作
); char* //该函数将返回一个指针,指向共享内存区的内存的初始位置
//将要操作的数据写入到共享内存的空间中
sprintf(
shared_memory, //写入数据的目的地的指针
string //写入的数据,可以通过变换写入自己的想要的数据类型
);
//分离出共享内存区域
shmdt(shared_memory);
//借助系统调用,把标志IPC_RMID和共享内存段的标识符一起做为参数,移除!
shmctl();
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>
// use for InterProcess Communication
#include<sys/shm.h>
#include<sys/stat.h>
#include<sys/wait.h>
// the global const variable
int value = 5 ;
int main()
{
pid_t pid ;
/**
begin the interprocess communication system call
*/
const int Size = 2048 ;
int segment_id = shmget(IPC_PRIVATE , Size , S_IRUSR | S_IWUSR) ;
char* shared_memory = (char*) shmat(segment_id, NULL, 0) ;
pid = fork();
if(pid == 0 ){
value += 15 ;
sprintf(shared_memory,"%d" , value );
printf("Value from Children : %d\n",value) ;
/**almostly we will add the return statement at the end of the child process to make sure the code return correctly.*/
return 0;
/** printf("Child value : %d",value);*/
}else if (pid > 0 ){
/** wait all the child end ,then notify the parent process */
wait(NULL);
/**sprintf(shared_memory,"%d" , value );*/
}
/** check the result of the shared_memory */
printf("Value from Parent : %s" , shared_memory) ;
/**to make sure deattach the shared_memory*/
shmdt(shared_memory) ;
/**remove the shared memory segment also */
shmctl(segment_id ,IPC_RMID , NULL) ;
return 0;
}
程序运行的结果如下:
消息传递方式
底层是在内核态创建一个缓冲区,需要进行通信的进程将数据写入缓冲区,然后对方借助系统调用的方式获取到数据,由此来实现进程之间的通信的方法!主要实现send方法和receive方法即可。
这种方式实现的思路比较简单,适用于数据量较小的通信。而且没有类似于共享内存方式的冲突问题发生。但是速度相对而言比较的慢,有利有弊吧!
内部的实现同样也有两种:
- 直接的消息传递
- 间接的消息传递(也成为邮箱模式)
直接消息传递是指接收和发送消息的时候都对相关的进程进行指定。
而间接的消息传递是指将消息都发送到一个“公共邮箱”,大家都可以进行数据的获取!前者比较适合于一对一的模式,后者则适用于一对多的通信。
总结
对于进程间的通信,里面可谓是有很大的学问。上面介绍的也不过是冰山一角而已。如果您发现文章中有不恰当的地方,欢迎指正。谢谢!
Linux 基于IPC机制实现进程间的共享内存处理的更多相关文章
- linux各种IPC机制(进程通信)
linux各种IPC机制 (2011-07-08 16:58:35) 原文地址:linux各种IPC机制(转)作者:jianpengliu 原帖发表在IBM的developerworks网站 ...
- win32进程间通讯--共享内存
小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...
- Nginx 进程间如何共享内存
L:37 Nginx 针对多进程用的是自旋锁(占用共享内存时间比较短的情况下否则可能会影响性能)注:自旋锁是不停的请求共享内存 而原先的信号量是等待占用者释放后通知等待的进程
- 20155202 张旭 课下作业: Linux下IPC机制
20155202张旭 Linux下IPC机制 IPC机制定义 在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方 ...
- (转)Linux环境进程间通信系列(五):共享内存
原文地址:http://www.cppblog.com/mydriverc/articles/29741.html 共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式.两个不同进程 A ...
- 20155239吕宇轩 Linux下IPC机制
20155239吕宇轩 Linux下IPC机制 - 共享内存 原理:把所有需要使用的共享数据都存放在共享内存 区域中,任何想要访问这些共享数据的进程都必须在自己的进程地址空间中新增加一块内存区域,用来 ...
- [转帖]linux各种IPC机制
linux各种IPC机制 docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/detai ...
- linux各种IPC机制
docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/details/78794775 原 ...
- Linux下IPC机制
Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...
随机推荐
- SQL Server 连接 MySQL
1.在SQL SERVER服务器上安装MYSQL ODBC驱动; 驱动下载地址:http://dev.mysql.com/downloads/connector/odbc/ 2.安装好后,在管理工具- ...
- UDA机器学习基础—评估指标
这里举例说明 混淆矩阵 精确率 召回率 F1
- 华科机考:N阶楼梯上楼
时间限制:1秒空间限制:32768K 题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描 ...
- 8.QT-对话框(模态与非模态)
对话框介绍 对话框是于用户进行简易交互的顶层窗口 QDialog是Qt中所有对话框窗口的父类,是一种容器类型的组件 QDialog继承于QWidget类,如下图所示: QWidget和QDialog有 ...
- 解决nodejs中json序列化时Date类型默认为UTC格式
在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 上面只是一个例子,下面我用一个更具体化的例子来展示一个这个情况,我们在开发WEB项目中,经常用到Express组件, 我 ...
- Ambari2.6.0 安装HDP2.6.3(离线安装)
一.下载安装包 因为使用在线安装特别慢,所有的安装包加起来有9个G左右,所以本教程是通过迅雷下载包,然后上传到服务器,通过配置本地源的方式来实现的离线安装.通过ambari安装需要下载下面的三个主要包 ...
- Python笔记(一)——打印输出
一.输出语句input 输出语句print 例:用户输入 username = input("username:") #变量名 显示的字符 password = input( ...
- Angular 路由配置
路由,简单的来说就是让组件之间进行跳转和参数的传递. 1.先在app目录下创建一个名为app.route.ts的路由组件 2.打开app.route.ts 在里面创建路由组件的代码(可通过编辑器快捷生 ...
- aways on 配置部署(一)——准备工作
sqlserver的aways on 配置需要经历三个步骤,前面两个步骤是对aways on 配置的一个准备步骤. 经过了一个星期的研究,终于成功的完成了前两个步骤,期间参考了很多的资料和博客,总感觉 ...
- 04_Struts2标签
1.通用标签: property标签: 用来输出值栈属性的值 如果value属性没有给出,ValueStack值栈栈顶对象的值被输出 许多情况下,EL表达式可以提供更简洁的语法 url标签: url方 ...