`

进程间通信学习笔记三(共享内存通信)

 
阅读更多

共享内存通信
被多个进程共享的一部分物理内存,是进程间共享数据的一种最快的方法
一个进程向共享内存区域写入数据,共享这个内存区域的所有进程都可以立刻看到
其中的内容


实现共享内存分为两个步骤:
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

分享到:
评论

相关推荐

    MFC教程lesson 17-进程间通信.rar

    4. **共享内存**:`CMemFile`和`CSharedFile`类可以帮助创建和访问共享内存,这是进程间通信的一种高效方式。 5. **命名管道**:MFC的`CNamedPipe`类使得通过管道进行进程间通信变得简单,这种通信方式适合大量数据...

    学习笔记信号量和进程间通信

    本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...

    记录自己共享内存学习笔记

    共享内存是一种进程间通信方式,它允许多个进程共享同一块物理内存区域,以实现进程之间的信息交换。共享内存的原理是将同一块物理内存映射到多个进程的地址空间中,使得多个进程可以访问和操作同一块内存区域。 ...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十五)进程间通信(三)文章代码

    《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现,其中第25章专注于进程间通信的探讨,特别是第三部分。这里我们将结合书中的内容和提供的代码,详细解析这一关键知识点。 首先,...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十四)进程间通信(二)文章代码

    总的来说,该读书笔记覆盖了操作系统设计中的核心知识点——进程间通信,深入解析了各种通信机制的工作原理和实现方式,对于操作系统爱好者和开发者来说,是一份非常宝贵的参考资料。通过学习和实践,我们可以提高在...

    操作系统学习笔记

    管道是一种半双工的数据通信通道,允许两个进程通过共享内存区域交换数据,常用于实现简单的进程间通信或构建复杂的命令行管道。 综上所述,这份学习笔记全面覆盖了操作系统的核心概念,从底层的保护模式编程到高层...

    VC学习笔记之二:进程通信.doc

    - 邮槽是一种轻量级的进程间通信机制,适用于小数据量的传输。 5. **Windows套接字(Sockets)** - 主要用于网络通信,也可以用于本地进程间的通信。 #### 二、设置进程优先级 为了确保进程在执行时不会受到其他...

    操作系统学习笔记(三)1

    操作系统是计算机系统的核心组成部分...综上所述,操作系统中的进程和线程是实现并发执行和资源共享的基础,而进程间通信则是不同进程协同工作的关键。理解这些基本概念对于深入学习操作系统和开发多线程程序至关重要。

    Windows TCP 通信学习笔记

    **Windows TCP 通信学习笔记** 在Windows操作系统中,TCP(Transmission Control Protocol)通信是网络编程的基础,用于在不同计算机之间建立可靠的数据传输通道。本文主要围绕Windows下的Winsock API进行探讨,该...

    Linux 进程 线程学习笔记

    Linux提供了多种机制来实现进程间通信(IPC),包括信号、管道、消息队列、共享内存和信号量等。 #### 线程管理 在Linux中,线程的创建和管理主要通过`pthread`库实现,其中`pthread_create()`用于创建新线程,`...

    ACE学习笔记总结和使用文档(资料比较多,整理了好长时间)

    ACE提供了一组丰富的可重用C++包装外观(wrapper facade)和构架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、...

    跨进程自学资料与笔记

    1. 进程间通信(IPC, Inter-Process Communication):这是跨进程的核心,包括管道、共享内存、消息队列、套接字、命名管道等多种方式。每种方式都有其适用场景和优缺点,需要根据实际需求选择。 2. 同步与互斥:当...

    《ORANGE’S:一个操作系统的实现》读书笔记(十五)进程(三)文章代码

    进程间通信允许进程之间共享数据、同步执行和协调工作。常见的IPC机制包括管道、消息队列、信号量、共享内存等。比如,管道提供了半双工通信,适合父子进程间简单数据传递;消息队列提供了有序且类型化的通信方式;...

    GoLang学习资源_学习笔记和并发编程实战

    Go语言的并发模型基于CSP(Communicating Sequential Processes)理论,强调通过数据通道进行进程间通信,而不是共享内存,这样可以减少因竞态条件导致的错误。Goroutines比操作系统线程更轻量,启动速度快,消耗...

    鸿蒙学习笔记.zip

    - **微内核设计**:采用微内核结构,提供更高的安全性和效率,微内核仅包含最基本的服务,如进程间通信和调度。 - **多设备适配**:鸿蒙系统能够适应各种硬件设备,包括手机、电视、汽车、可穿戴设备等。 - **...

    操作系统课程学习笔记

    而线程则是进程内的执行单元,共享同一地址空间,线程间的切换比进程更高效。调度算法,如FCFS(先来先服务)、SJF(最短作业优先)、优先级调度、多级反馈队列等,用于决定哪个进程或线程获得CPU执行权。 内存管理...

    linux编程学习笔记PDF资料下载.txt

    - **进程间通信(IPC)**:Linux提供了多种进程间通信机制,如管道、消息队列、共享内存、信号量等。 - **线程编程**:多线程编程可以利用多核处理器的并行计算能力,提高程序的执行效率。 - **同步与互斥**:为了...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    linux下C语言开发笔记整理

    进程间通信(IPC)允许独立的进程交换数据,常见的IPC方法包括管道(pipes)、消息队列、共享内存等。 ### Unix/Linux系统的网络编程 网络编程是Linux下C语言开发的核心内容之一,涉及套接字编程,用于实现网络...

    《操作系统》学习笔记(思维导图)

    同时,操作系统还需要处理进程间的通信(如共享内存、消息传递)和同步(如信号量机制、管程)问题,以确保系统的正确运行。 2. 存储系统: 存储系统分为内存和外存两部分。内存包括主存(RAM)和高速缓存(Cache...

Global site tag (gtag.js) - Google Analytics