共享内存通信
被多个进程共享的一部分物理内存,是进程间共享数据的一种最快的方法
一个进程向共享内存区域写入数据,共享这个内存区域的所有进程都可以立刻看到
其中的内容
实现共享内存分为两个步骤:
1 创建共享内存,使用shmget函数
函数原型:
int shmget(key_t key,int size,int shmflg)
key:标识共享内存的键值 0 如果shmflg设置为IPC_PRIVATE,同样会创建
一块新的共享内存
IPC_PRIVATE 创建一块新的共享内存
如果成功返回共享内存标识符,失败返回-1
2 映射共享内存,将这段创建的共享内存映射到具体的进程空间中,使用shmat函数
函数原型:
int shmat(int shmid,char *shmaddr,int flag)
shmid:shmget函数返回的共享存储标识符
flag:决定以什么方式来确定映射的地址(通常为0)
成功返回共享内存映射到进程中的地址,失败返回-1
3 解除映射
int shmdt(char *shmaddr)
示例代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PERM S_IRUSR|S_IWUSR
int main(int argc,char ** argv){
int shmid;
char *p_addr,*c_addr;
if(argc!=2){
fprintf(stderr,"usage:%s\n\a",argv[0]);
exit(1);
}
/*创建共享内存*/
if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1){
fprintf(stderr,"create share memory error:%s\n\a",strerror(errno));
exit(1);
}
/*创建子进程*/
if(fork()){//父进程写
/*映射共享内存*/
p_addr=shmat(shmid,0,0);
memset(p_addr,'\0',1024);//对内存进行清除
strncpy(p_addr,argv[1],1024);
wait(NULL);//释放资源,不关心终止状态
exit(0);
}else{//子进程读
sleep(1);//暂停1秒钟
c_addr=shmat(shmid,0,0);
printf("client get %s\n",c_addr);
exit(0);
}
}
查看运行结果:
[root@localhost app]# gcc shmem.c -o shmem
[root@localhost app]# ./shmem 123
client get 123
- 浏览: 263225 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
发表评论
-
u-boot Makefile 文件分析
2013-06-01 21:44 2429Makefile文件分析 # #(C)Copyri ... -
uboot start.S文件分析
2013-06-03 22:18 1325U-boot第一个开始文件arch\arm\cpu\arm1 ... -
u-boot mkconfig文件分析
2013-05-31 21:29 1140Mkconfig文件分析 #!/bin/ ... -
链接地址学习笔记
2013-05-05 12:40 1287链接地址 启动过程 示例代码如下: ... -
DDR学习笔记
2013-05-11 14:19 1041DDR 15条地址线32k 128M*2(20)=2(2 ... -
nand flash学习笔记一
2013-05-13 21:05 962Nandflash 原理图上有data0-data7 ... -
openJTAG学习笔记一
2013-05-22 21:45 2183安装软件 光盘Windows\install目录下的 01.O ... -
linux进程管理学习笔记
2013-03-28 20:57 1367linux 进程管理 1 linux进程控制 进程的四个要素: ... -
字符设备驱动程序学习笔记一
2013-04-01 21:55 889linux 驱动程序 字符设备驱动程序 网络接口驱动程序 块设 ... -
字符设备驱动程序学习笔记二
2013-04-04 10:29 755字符驱动程序 1 设备号 字符设备通过字符设备文件来存取 ls ... -
字符设备驱动程序学习笔记三
2013-04-04 14:03 789memdev.h文件示例代码如下: #ifndef _MEM ... -
字符设备驱动程序学习笔记四
2013-04-05 11:12 589竟争与互斥 程序调试 1 ... -
GPIO学习笔记
2013-04-14 19:50 813用汇编点亮一个led 1看原理图GPK4=0,led亮G ... -
系统时钟学习笔记
2013-05-04 21:59 83712m晶振----->pll------>cpu ... -
UART学习笔记
2013-05-04 22:00 1167串口(UART) DIV_VAL=(PCLK/(bpsx1 ... -
linux内存管理学习笔记
2013-03-12 20:50 10781 linux内存管理 地址类型 物理地址 出现在cpu地址 ... -
嵌入式linux系统学习笔记
2013-03-06 21:39 973嵌入式linux内核制作 1 清除原有配置文件与中间文件 x8 ... -
原理图学习笔记一
2013-02-17 22:24 425画个草图也挺过瘾 -
进程间通信学习笔记一(管道通信)
2013-02-01 20:08 1418进程间通信(ipc) 应用场景: 数据传输 资源共享 通知事件 ... -
进程间通信学习笔记二(信号通信)
2013-02-16 21:39 793信号通信 用户按某些键时,产生信号 硬件异常产生信号 进程用k ...
相关推荐
4. **共享内存**:`CMemFile`和`CSharedFile`类可以帮助创建和访问共享内存,这是进程间通信的一种高效方式。 5. **命名管道**:MFC的`CNamedPipe`类使得通过管道进行进程间通信变得简单,这种通信方式适合大量数据...
本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...
共享内存是一种进程间通信方式,它允许多个进程共享同一块物理内存区域,以实现进程之间的信息交换。共享内存的原理是将同一块物理内存映射到多个进程的地址空间中,使得多个进程可以访问和操作同一块内存区域。 ...
《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现,其中第25章专注于进程间通信的探讨,特别是第三部分。这里我们将结合书中的内容和提供的代码,详细解析这一关键知识点。 首先,...
总的来说,该读书笔记覆盖了操作系统设计中的核心知识点——进程间通信,深入解析了各种通信机制的工作原理和实现方式,对于操作系统爱好者和开发者来说,是一份非常宝贵的参考资料。通过学习和实践,我们可以提高在...
管道是一种半双工的数据通信通道,允许两个进程通过共享内存区域交换数据,常用于实现简单的进程间通信或构建复杂的命令行管道。 综上所述,这份学习笔记全面覆盖了操作系统的核心概念,从底层的保护模式编程到高层...
- 邮槽是一种轻量级的进程间通信机制,适用于小数据量的传输。 5. **Windows套接字(Sockets)** - 主要用于网络通信,也可以用于本地进程间的通信。 #### 二、设置进程优先级 为了确保进程在执行时不会受到其他...
操作系统是计算机系统的核心组成部分...综上所述,操作系统中的进程和线程是实现并发执行和资源共享的基础,而进程间通信则是不同进程协同工作的关键。理解这些基本概念对于深入学习操作系统和开发多线程程序至关重要。
**Windows TCP 通信学习笔记** 在Windows操作系统中,TCP(Transmission Control Protocol)通信是网络编程的基础,用于在不同计算机之间建立可靠的数据传输通道。本文主要围绕Windows下的Winsock API进行探讨,该...
Linux提供了多种机制来实现进程间通信(IPC),包括信号、管道、消息队列、共享内存和信号量等。 #### 线程管理 在Linux中,线程的创建和管理主要通过`pthread`库实现,其中`pthread_create()`用于创建新线程,`...
ACE提供了一组丰富的可重用C++包装外观(wrapper facade)和构架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、...
1. 进程间通信(IPC, Inter-Process Communication):这是跨进程的核心,包括管道、共享内存、消息队列、套接字、命名管道等多种方式。每种方式都有其适用场景和优缺点,需要根据实际需求选择。 2. 同步与互斥:当...
进程间通信允许进程之间共享数据、同步执行和协调工作。常见的IPC机制包括管道、消息队列、信号量、共享内存等。比如,管道提供了半双工通信,适合父子进程间简单数据传递;消息队列提供了有序且类型化的通信方式;...
Go语言的并发模型基于CSP(Communicating Sequential Processes)理论,强调通过数据通道进行进程间通信,而不是共享内存,这样可以减少因竞态条件导致的错误。Goroutines比操作系统线程更轻量,启动速度快,消耗...
- **微内核设计**:采用微内核结构,提供更高的安全性和效率,微内核仅包含最基本的服务,如进程间通信和调度。 - **多设备适配**:鸿蒙系统能够适应各种硬件设备,包括手机、电视、汽车、可穿戴设备等。 - **...
而线程则是进程内的执行单元,共享同一地址空间,线程间的切换比进程更高效。调度算法,如FCFS(先来先服务)、SJF(最短作业优先)、优先级调度、多级反馈队列等,用于决定哪个进程或线程获得CPU执行权。 内存管理...
- **进程间通信(IPC)**:Linux提供了多种进程间通信机制,如管道、消息队列、共享内存、信号量等。 - **线程编程**:多线程编程可以利用多核处理器的并行计算能力,提高程序的执行效率。 - **同步与互斥**:为了...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
进程间通信(IPC)允许独立的进程交换数据,常见的IPC方法包括管道(pipes)、消息队列、共享内存等。 ### Unix/Linux系统的网络编程 网络编程是Linux下C语言开发的核心内容之一,涉及套接字编程,用于实现网络...
同时,操作系统还需要处理进程间的通信(如共享内存、消息传递)和同步(如信号量机制、管程)问题,以确保系统的正确运行。 2. 存储系统: 存储系统分为内存和外存两部分。内存包括主存(RAM)和高速缓存(Cache...