Posix共享内存

Posix共享内存涉及以下两个步骤:

1、指定一个名字参数调用shm_open,以创建以一个新的共享内存区对象或打开一个已存在的共享内存区对象。

2、调用mmap把这个共享内存区映射到调用进程的地址空间。

头文件:

#include<sys/mman.h>

#include<sys/stat.h>

#include<fcntl.h>

int shm_open(const char *name, int oflag, mode_t mode);

int shm_unlink(const char *name);

Link with -lrt(要注意连接这个库)

oflag参数是O_CRTEA|O_RDWR等标志;

mode参数指定权限位如果没有指定O_CREAT标志,那么该参数可以指定为0。(如果是创建的话权限要给够,平常是0644的权限,否则别的进程可能没有权限)。

一般创建的文件是自动放在/dev/shm/的目录下的。

新创建的文件大小一般为0,所以mmap函数调用文件标识符的时候会出错,这时候要用ftruncate()函数扩大文件

#include<unistd.h>

int ftruncate(int fd,off_t length);    成功返回0,出错返回-1

对于一个普通文件:如果该文件的大小大于length参数,额外的数据就会被丢掉。

对于一个共享内存区对象:把该对象的大小设置成length字节。

当打开一个已存在的共享内存对象时,我们可以调用fstat来获取有关该对象的信息。

#include<sys/types.h>

#include<sys/stat.h>

int fstat(int fd, struct stat *buf);

stat结构有12个或以上的成员,  但当fd指代一个共享内存区对象时,只有四个成员含有信息。

struct stat{

mode_t    st_mode;

uid_t        st_uid;

gid_t        st_gid;

off_t        st_size;

};

调用时不用定义这个结构体,直接实例化就行了,如:struct stat sta;

下面是两个例子,一个是向共享内存里写,一个读取;

read:

#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>

int main(int argc,char* argv[])
{
    int fd = shm_open(argv[1],O_RDONLY,0);
    void* buf = NULL;
    if((buf = mmap(NULL,BUFSIZ,PROT_READ,MAP_SHARED,fd,0)) ==MAP_FAILED ){
        perror("mmap error\n");
        return 1;
    }
    sleep(1);
    while(1){
        printf("read:%s\n",buf);
        sleep(3);
    }
    munmap(buf,BUFSIZ);
    close(fd);
}

执行:./read mmap.txt

write:

#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>

int main(int argc,char* argv[])
{
    int fd = shm_open(argv[1],O_CREAT|O_RDWR,0644);
    if(fd == -1){
        perror("shm_open error\n");
        return 1;
    }
    ftruncate(fd,100);
    void* buf = NULL;
    if((buf = mmap(NULL,BUFSIZ,PROT_WRITE,MAP_SHARED,fd,0))== MAP_FAILED){
        perror("mmap error\n");
        return 1;
    }
    int i;
    for(i=2;i<argc;i++){
        strcpy(buf,argv[i]);
        sleep(3);
    }
    munmap(buf,BUFSIZ);
    close(fd);
}

执行:

./write mmap.txt aaa bbb ccc

时间: 2024-10-12 08:35:04

Posix共享内存的相关文章

Linux环境编程之共享内存区(二):Posix共享内存区

现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内.Posix提供了两种在无亲缘关系进程间共享内存区的方法: 1.内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件.(上一节就是这种技术) 2.共享内存区对象:由shm_open打开一个Posix名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间.(本节内容) Posix共享内存区涉及以下两个步骤要求: 1.指定一个名字参数调用shm_open

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

1. 创建/获取一个共享内存 #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); 参数: name:  共享内存名字; oflag: 与open函数类型, 可以是O_RDONLY, O_WR

细说linux IPC(四):posix 共享内存

上一节讲了由open函数打开一个内存映射文件,再由mmap函数把得到的描述符映射到当前进程地址空间中来.这一节说说另外一种类似的共享内存方法,即 有shm_open函数打开一个Posix.1 IPC名字(也许是文件系统中的一个路径名),所返回的描述符由函数mmap映射到当前进程地址空间.        posix共享内存和尚上一节类似,首先需要制定一个名字参数调用shm_open ,以创建一个新的共享内存对象或打开一个已存在的共享内存对象:然后再调用mmap把共享内存区映射到调用进程的地址空间中

linux网络编程之posix共享内存

今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的消息队列是在虚拟文件当中创建一个消息队列,需要我们手工将它挂载到某个目录下才能看到,同样的,posix共享内存也是需要将其挂载,只不过这个挂载操作是由系统完成的,而不用我们人工去操作了,已经挂载到了/dev/shm下了,如下: 接下来要介绍的函数为修改共享内存的大小: [说明]:实际上ftrunca

POSIX 共享内存

POSIX共享内存相关函数: shm_open函数 功能:用来创建或打开一个共享内存对象 原型 int shm_open(const char *name, int oflag, mode_t mode); 参数 name:共享内存对象的名字 oflag:与open函数类似,可以是O_RDONLY.O_RDWR,还可以按位或上O_CREAT.O_EXCL.O_TRUNC等. mode:此参数总是需要设置,如果oflag没有指定了O_CREAT,可以指定为0 返回值:成功返回非负整数文件描述符:失

linux进程间通信之Posix共享内存用法详解及代码举例

Posix共享内存有两种非亲缘进程间的共享内存方法:1).  使用内存映射文件,由open函数打开,再由mmap函数把返回的文件描述符映射到当前进程空间中的一个文件. 2). 使用共享内存区对象,由shm_open打开一个 Posix IPC名字.再由mmap把返回的描述符映射到当前进程的地址空间. Posix共享内存相关函数头文件及原型:#include <sys/mman.h>int shm_open(const char *name, int oflag, mode_t mode);功能

linux c编程:Posix共享内存区

Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核.这样就可以减少系统调用时间,提高程序效率.共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中.其他进程可以把同一段共享内存段“连接到”它们自己的地址空间里去.所有进程都可以访问共享内存中的地址.如果一个进程

system v和posix的共享内存对比

参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2)有两类基本的API函数用于在进程间共享内存:System v和POSIX.  (当然,还有mmap,属于POSIX的) 3)这两类函数上使用相同的原则,核心思想就是任何要被共享的内存都必须经过显示的分配. 4)因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率. 5)内核没有

IPC: 共享内存

################################################### 共享内存区   共享内存是IPC形式中最快的,因为共享内存不和内核进行数据交换. 通过fork派生的子进程不与父进程共享内存区.   共享内存区分为: 1.posix共享内存区 2.system V共享内存区 共享内存有两种形式: 1.匿名共享内存 2.有名共享内存 ----------------------------------------------------------- posi