【版权声明:尊重原创。转载请保留出处: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. Qt发布可能遇到的问题

    1.首先要搞清楚动态链接库还是静态链接 本文只涉及动态链接库,就是编译出来的exe文件加上Qt 的必要dll文件. 一般跟别人一样的操作,直接双击 XX.exe,提示缺少什么dll,就去Qt的安装目录 ...

  2. 五十八 数据库访问使用SQLite

    SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. Python就 ...

  3. hdu 1698 Just a Hook(线段树区间修改)

    传送门:Just a Hook Problem Description In the game of DotA, Pudge’s meat hook is actually the most horr ...

  4. python 重新执行循环中出错的那一次

    # coding: utf-8 li = [1,2,3,4,5] for num in li: while True: try: # do something except some error: c ...

  5. BZOJ2654/COGS1764 [2012国家集训队]tree(陈立杰) [生成树,二分]

    BZOJ传送门,COGS传送门 tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V, ...

  6. scrapy抓取拉勾网职位信息(四)——对字段进行提取

    上一篇中已经分析了详情页的url规则,并且对items.py文件进行了编写,定义了我们需要提取的字段,本篇将具体的items字段提取出来 这里主要是涉及到选择器的一些用法,如果不是很熟,可以参考:sc ...

  7. Why Did the Cow Cross the Road III(树状数组)

    Why Did the Cow Cross the Road III 时间限制: 1 Sec  内存限制: 128 MB提交: 65  解决: 28[提交][状态][讨论版] 题目描述 The lay ...

  8. 图灵杯 E 简单的RMQ(UVA 11235)(RMQ)

    E: 简单的RMQ 时间限制: 2 Sec  内存限制: 64 MB提交: 934  解决: 165[提交][状态][讨论版] 题目描述 给定一个数组,其中的元素满足非递减顺序.任意给定一个区间[i, ...

  9. Git Bash 将本地代码提交到Github

    前提:已拥有Token,并且把本地的Token配置到了自己的Github里面(没有Token的自行去百度如何配置Token) 测试一下自己的连接 ssh -T git@github.com 本地操作: ...

  10. SQL中on和where的使用及其差异

    在编写SQL脚本中,多表连接查询操作需要使用到on和where条件,但是经常会混淆两者的用法,从而造成取数错误.为此,使用测试数据进行总结如下: 1.现有两张测试表,table_a和table_b. ...