【版权声明:尊重原创。转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途】

        上一节讲了由open函数打开一个内存映射文件。再由mmap函数把得到的描写叙述符映射到当前进程地址空间中来。

这一节说说第二种类似的共享内存方法。即有shm_open函数打开一个Posix.1 IPC名字(或许是文件系统中的一个路径名)。所返回的描写叙述符由函数mmap映射到当前进程地址空间。

        

posix共享内存和尚上一节类似,首先须要制定一个名字參数调用shm_open 。以创建一个新的共享内存对象或打开一个已存在的共享内存对象;然后再调用mmap把共享内存区映射到调用进程的地址空间中。

shm_open函数原型例如以下:

       #include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */ int shm_open(const char *name, int oflag, mode_t mode); Link with -lrt.

參数name为将要被打开或创建的共享内存对象,须要指定为/name的格式。

參数oflag必需要有O_RDONLY(仅仅读)、标志O_RDWR(读写)。除此之外还能够指定O_CREAT(没有共享对象则创建)、O_EXCL(假设O_CREAT指定,但name不存在,就返回错误)、O_TRUNC(假设共享内存存在,长度就截断为0)。

參数mode为指定权限位。在指定了O_CREAT的前提下使用,假设没有指定O_CREAT,mode能够指定为0.



该函数返回一个描写叙述符,在mmap函数(见上一节)第五个參数使用。

#define SHM_IPC_FILENAME "sln_shm_file"
#define SHM_IPC_MAX_LEN 1024

ser:

int sln_shm_get(char *shm_file, void **shm, int mem_len)
{
int fd; fd = shm_open(shm_file, O_RDWR | O_CREAT, 0644);
if (fd < 0) {
printf("shm_open <%s> failed: %s\n", shm_file, strerror(errno));
return -1;
} ftruncate(fd, mem_len); *shm = mmap(NULL, mem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (MAP_FAILED == *shm) {
printf("mmap: %s\n", strerror(errno));
return -1;
} close(fd); return 0;
} int main(int argc, const char *argv[])
{
char *shm_buf = NULL; sln_shm_get(SHM_IPC_FILENAME, (void **)&shm_buf, SHM_IPC_MAX_LEN); snprintf(shm_buf, SHM_IPC_MAX_LEN, "ipc client get: hello posix share memory ipc! This is write by server."); return 0;
}

编译运行结果例如以下:

# ./server
# ./client
ipc client get: hello posix share memory ipc! This is write by server.
#

shm_open创建的文件位置位于 /dev/shm/ 文件夹下:

# ll /dev/shm/
-rw-r--r-- 1 root root 8193 Oct 30 14:13 sln_shm_file
#

posix共享内存同步能够使用posix信号量来实现,具体在后面同步相关专栏会有具体解说。

本节源代码下载:

http://download.csdn.net/detail/gentleliu/8140869

细说linux IPC(四):posix 共享内存的更多相关文章

  1. Linux IPC System V 共享内存

    模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...

  2. Linux IPC实践(8) --共享内存/内存映射

    概述 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图). 共享内存 VS ...

  3. Linux IPC实践(10) --Posix共享内存

    1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #inc ...

  4. linux c编程:Posix共享内存区

    Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映 ...

  5. linux网络编程之posix共享内存

    今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...

  6. Linux环境进程间通信(五): 共享内存(上)

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  7. POSIX共享内存

    DESCRIPTION 共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存. 如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存 ...

  8. Posix共享内存区

    1.概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就 ...

  9. Linux环境编程之共享内存区(一):共享内存区简单介绍

    共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...

随机推荐

  1. grunt 自定义任务实现js文件的混淆及加密

    //自定义任务 module.exports = function (grunt) { // 项目配置 var http = require('http'); var qs = require('qu ...

  2. HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. Apache配置文件相关命令

    转:http://www.365mini.com/page/apache-options-directive.htm Options指令是Apache配置文件中一个比较常见也比较重要的指令,Optio ...

  4. HRBUST 1213 单词接龙

    暴力搜索. 按照能配对的关系建立有向边,然后暴力搜索. #include<cstdio> #include<cstring> #include<cmath> #in ...

  5. Xamarin.Forms教程Android SDK工具下载安装

    Xamarin.Form的Android SDK工具下载安装 本节将讲解如何下载Xamarin.Form的Android SDK工具,并使用其中的工具管理Android SDK,如何创建模拟器等内容. ...

  6. 【转】python assert用法

    1.assert语句用来声明某个条件是真的.2.如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句.3 ...

  7. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  8. Problem C: 输入10个数,根据提示进行从小到大输出或从大到小输出

    #include<stdio.h> int main() { char ch; ]; while(scanf("%c",&ch)!=EOF) { int i,j ...

  9. JavaScript之String类型

    这里先总结一下RegExp类型的两个主要方法: (1)exec():主要用于捕获组.接受一个参数,这个参数是主要应用模式的字符串,然后返回包含第一个匹配项信息的数组. (2)test():主要用于目标 ...

  10. ES6 Set结构和Map结构(上)

    Set ES6提供了新的数据结构--Set,它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身也是一个构造函数,用来生成Set数据结构 var s = new Set(); [2,3,5 ...