`
king_tt
  • 浏览: 2119764 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux进程间通信(七)---共享内存之shmget()、shmat()、shmdt()及其基础实验

 
阅读更多

概述

可以说,共享内存是一种最为高效的进程间通信方式,因为进程可以直接读写内存,不需要任何数据的复制。为了在多个进程间交换信息,内核专门留出了一块内存区,这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一段内存区而不需要进行数据的复制,从而大大提高了效率。当然,由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等。共享内存的原理图如下图1所示

共享内存使用步骤

① 创建共享内存。也就是从内存中获得一段共享内存区域,这里用到的函数是shmget();

②映射共享内存。也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。到这一步就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作。

③ 撤销映射。使用完共享内存就需要撤销,用到的函数是shmdt()。

函数说明

基础实验1

功能

本实验意在说明如何使用基本的共享内存函数。首先创建一个共享内存区(采用的共享内存的键值是IPC_PRIVATE,是因为本实验中创建的共享内存是父子进程间的共用部分),然后创建子进程,在父子两个进程中将共享内存分别映射到各自的进程地址空间中。

父进程先等待用户输入,然后将用户输入的字符串写入到共享内存,之后向共享内存的头部写入“WROTE”字符串表示父进程已成功写入数据。子进程一直等到共享内存的头部字符串为“WROTE”,然后将共享内存的有效数据(在父进程中用户输入的字符串)在屏幕上打印。父子两个进程在完成以上工作后,分别解除与共享内存的映射关系。

最后在子进程中删除共享内存。因为共享内存自身并不提供同步机制,所以应额外实现不同进程间的同步(如信号量)。为了简单起见,在本实验中用标志字符串来实现非常简单的父子进程间的同步。

在本实验中,用到了一个命令是 ipcs ,它用于报告进程间通信机制状态,它可以查看共享内存、消息队列等各种进程间通信机制的情况,这里使用了system()函数调用shell命令"ipcs -m",有关于ipcs命令和system()函数不了解的可以查查哈。

源程序

程序上传到网站,如有需要,请自行下载,shmem.c文件点此下载




执行结果



基础实验2

功能

完成的功能和基础实验1一样,唯一不同的就是实现同步的方法不一样,实验1是利用标志字符位来实现同步的,而本实验是利用信号量实现同步的,如果信号量不会的话,请看博客:

http://blog.csdn.net/mybelief321/article/details/9086151

源程序

本程序中有关信号量的代码我是直接复制上一节的代码,本实验的完整程序我上传到网站,如有需要请自行下载,shmem_sem.c文件点此下载




执行结果



希望和实验1比较,从而对信号量实现同步有跟深刻的认识。

/*****************************************************************/

如需转载请注明出处

http://blog.csdn.net/mybelief321/article/details/9170041

/****************************************************************/

分享到:
评论

相关推荐

    linux kernel 源码剖析 共享内存部分

    这是我剖的2.6.15版本的linux内核源码 共享内存部分源码 其中包括shmget shmmat shmdt shmctl函数的内核调用,以及内核创建共享内存的过程。

    操作系统《02-基于共享存储区的进程间通信的设计》

    ⑴ 把内存段直接映射到调用进程的地址空间中,然后其他的进程可以读写此内存段; ⑵ 使用系统调用:shmget(),shmat(),shmdt()和shmctl(),编制一长度为1K的信息的发送和接收的程序; ⑶ 分析程序,说明shmget(),...

    linux 共享内存浅析

    shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。 参数char *shmaddr是那块共享内存的起始地址。 成功时返回0。失败时返回-1。 shmdt( head ); // 禁止本进程使用这块内存 此外,还有一个用来控制...

    电子科大操作系统实验课Linux通过管道实现进程间通信

    操作系统实验完整报告 在Linux系统中使用系统调用fork()创建两个子进程,使用系统调用pipe()建立一个管道,两个子进程分别向管道各写一句话: Child process 1 is sending a message! Child process 2 is sending a...

    Linux /Unix 共享内存

    4) shmdt()函数删除本进程对这块内存的使用,shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。 函数原型: int shmdt( char *shmaddr ); 参数char *shmaddr是那块共享内存的起始地址。 成功时返回0。...

    Embedfire-imx6#embed_linux_tutorial_ppt#system-V 共享内存1

    system-V 共享内存作用高效率传输大量数据共享内存用法构造一个共享内存对象(shmget)共享内存映射(shmat)解除共享内存映射(shmdt)删除共享

    浙江理工大学操作系统实验2:进程通信报告

    (3) 使用系统调用shmget(),shmat(),shmdt(),shmctl(),编制程序。要求在父进程中生成一个30字节长的私有共享内存段。接下来,设置一个指向共享内存段的字符指针,将一串大写字母写入到该指针指向的存贮区。调用...

    UNIX网络编程 卷2:进程间通信

     第14章 System V共享内存区 276  14.1 概述 276  14.2 shmget函数 276  14.3 shmat函数 277  14.4 shmdt函数 277  14.5 shmctl函数 277  14.6 简单的程序 278  14.7 共享内存区限制 281  14.8 小结 282  ...

    linux进程之间的通讯综合实例.zip_Linux共享内存_TCP/IP_message_pipe/fifo_shm

    B与C使用共享内存来交互 步骤是:shmget->shmat->直接读写--->shmdt shmctl(删除) 可以man C与D之间使用消息传递进行 msgget-->msgrcv->msgsnd (注意这里的返回值判断发送正确与否 不是发送的...

    《UNIX网络编程 第2版. 第2卷, 进程间通信(中文版)》(W·Richard Stevens[美] 著)

    本书全面深入地讲解了各种进程间通信形式,包括消息传递、同步、共享内存及远程调用(RPC)。书中包含了大量经过优化的源代码,帮助读者加深理解。这些源代码可以从图灵网站本书网页免费注册下载。本书是网络研究和...

    UNIX网络编程 卷2 进程间通信 带完整书签,完整目录

    第14章 System V共享内存区 276 14.1 概述 276 14.2 shmget函数 276 14.3 shmat函数 277 14.4 shmdt函数 277 14.5 shmctl函数 277 14.6 简单的程序 278 14.7 共享内存区限制 281 14.8 小结 282 习题 283 ...

    一张图深度解析Linux共享内存的内核实现

    本文首先介绍了众所周知的共享内存用户态API,然后介绍了相关的内核主要数据结构,并逐一分析了shmget、shmat、数据访问、shmdt的内核实现及数据结构之间的动态关系,从数据的关联图即可一窥共享内存的实现机制。

    操作系统实验3.doc

    实验三 管道及共享内存 1. 实验目的 熟悉管道通信,了解管道内数据的读取与写入过程; 学会创建管道、使用管道,实现父子进程间的通信; 熟悉各种管道通信时使用的函数; 熟悉共享内存的概念; 学会使用函数创建共享...

    共享存储区的通信方式

    linux系统的通信机构IPC中消息通信机制提供四个操纵共享存储区的系统调用: shmget()的主要功能是建立新的共享存储区或返回一个已存在的共享存储区描述字, shmat(shmid,addr,flag)的主要功能是将物理共享区附接到...

    操作系统实验4-4实验报告.docx

    操作系统实验报告 实验4-4: Linux共享存储通信 实验目的 (1) 掌握Linux提供的共享存储区通信方式的使用方法。 (2) 了解共享存储区通信方法的特点。 (3) 了解实现进程间通信的不同方法之间的区别、特点和适用情况。 ...

    UNIX网络编程 第2卷 进程间通信

    本书全面深入地讲解了各种进程间通信形式,包括消息传递、同步、共享内存及远程调用(RPC)。书中包含了大量经过优化的源代码,帮助读者加深理解。这些源代码可以从图灵网站本书网页免费注册下载。 本书是网络研究和...

    libandroid-shmem:使用Ashmem在Android上进行System V共享内存仿真

    libandroid-shmem 在使用ashmem在Android上进行System V共享内存(shmget,shmat,shmdt和shmctl)仿真。 它创建的共享内存段将在创建过程销毁它们或死时自动销毁,这与System V共享内存行为不同。 基于先前工作。...

    UnixProgramming

    共享内存shmget、shmat/shmdt、shmctl UNIX域套接字socketpair/socket,socket 信号kill 线程 线程模型:内核线程、用户线程、双层调度 线程API 创建pthread_create 初始化pthread_once 结束pthread_exit 回收...

    华中科技大学操作系统实验报告.docx

    (3) 了解系统调用pipe( )、msgget( )、msgsnd( )、msgrcv( )、msgctl( )、shmget( )、shmat( )、shmdt( )、shmctl( )的功能和实现过程,利用共享存储区机制进行进程间通信。 二、实验内容 1、实验要求 (1) 进程...

    c-inter-process-communication-example

    此示例包含一个main.c文件,其中显示框通过fork函数以及通过shmget , shmat , shmdt和shmctl函数进行的共享内存访问将执行克隆到子进程中。 链接到linux函数文档: 生成并运行 此存储库已准备好进行编译,并...

Global site tag (gtag.js) - Google Analytics