`
king_tt
  • 浏览: 2141350 次
  • 性别: 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)删除共享

    操作系统实验5进程间基于共享存储区的通信.doc

    操作系统实验5进程间基于共享存储区的通信 本实验报告的主要目的是为了了解Linux系统的通信机构IPC,掌握IPC中的共享存储区通信机制,理解共享存储区通信的方法与特征。实验内容是编写一段程序,同时父进程创建两...

    Linux多进程运行的数据共享.pdf

    如果两个进程要共享数据,就要使用另一套函数(shmget,shmat,shmdt 等)来操作。现在,已经是两个进程了,对于父进程,fork 函数返回了子程序的进程号,而对于子程序,fork 函数则返回零,这样,对于程序,只要...

    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 (注意这里的返回值判断发送正确与否 不是发送的...

    一个简单的示例,演示了如何在 C 语言中使用共享内存

    接着,我们使用 shmat() 函数将共享内存段附加到进程的地址空间中,并使用 strcpy() 函数向共享内存中写入数据。然后,我们等待一段时间,最后从共享内存中读取数据并打印。最后,我们使用 shmdt() 函数分离共享内存...

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

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

    Linux下的多进程编程.pdf

    Linux 提供了多种方式来实现进程之间的同步和通信,例如,使用shmget、shmat、shmdt 等函数来实现共享内存的进程之间的通信。 5. 总结 Linux 下的多进程编程是一个非常重要的概念,它可以帮助开发者更好地管理系统...

    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的内核实现及数据结构之间的动态关系,从数据的关联图即可一窥共享内存的实现机制。

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

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

    操作系统实验3.doc

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

    共享存储区的通信方式

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics