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



概述

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

共享内存使用步骤

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

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

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

函数说明

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

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

  

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

 

基础实验1

 功能

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

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

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

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

源程序

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

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

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

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

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

 执行结果

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

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


基础实验2

功能

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

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

源程序

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

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

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

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

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

执行结果

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

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

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

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

原文地址:http://blog.csdn.net/mybelief321/article/details/9170041

 

你可能感兴趣的:(linux,共享内存)