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

返回值:成功返回非负整数文件描述符;失败返回-1

修改共享内存大小ftruncate

功能:修改共享内存对象大小

原型

int ftruncate(int fd, off_t length);

参数

fd: 文件描述符

length:长度

返回值:成功返回0;失败返回-1

获取共享内存对象信息

功能:获取共享内存对象信息

原型

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

参数

fd: 文件描述符

buf:返回共享内存状态

返回值:成功返回0;失败返回-1

shm_unlink函数

功能:删除一个共享内存对象

原型

int shm_unlink(const char *name);

参数

name: 共享内存对象的名字

返回值:成功返回0;失败返回-1

共享内存对象的映射

功能:将共享内存对象映射到进程地址空间。

原型

void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

参数

addr: 要映射的起始地址,通常指定为NULL,让内核自动选择

len:映射到进程地址空间的字节数

prot:映射区保护方式

flags:标志

fd:文件描述符

offset:从文件头开始的偏移量

返回值:成功返回映射到的内存区的起始地址;失败返回-1

01shm_open.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <sys/stat.h>        /* For mode constants */

#include <fcntl.h>           /* For O_* constants */

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#define ERR_EXIT(m) \

do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

typedef struct stu

{

char name[32];

int age;

} STU;

int main(void)

{

int shmid;

shmid = shm_open("/xyz", O_CREAT | O_RDWR, 0666);

if (shmid == -1)

ERR_EXIT("shm_open");

printf("shm_open succ\n");

if (ftruncate(shmid, sizeof(STU)) == -1)

ERR_EXIT("ftruncate");

struct stat buf;

if (fstat(shmid, &buf) == -1)

ERR_EXIT("fstat");

printf("size=%ld mode=%o\n", buf.st_size, buf.st_mode & 07777);

close(shmid);

return 0;

}

02shm_unlink.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <sys/stat.h>        /* For mode constants */

#include <fcntl.h>           /* For O_* constants */

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#define ERR_EXIT(m) \

do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

typedef struct stu

{

char name[32];

int age;

} STU;

int main(void)

{

shm_unlink("/xyz");

return 0;

}

03shm_write.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <sys/stat.h>        /* For mode constants */

#include <fcntl.h>           /* For O_* constants */

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#define ERR_EXIT(m) \

do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

typedef struct stu

{

char name[32];

int age;

} STU;

int main(void)

{

int shmid;

shmid = shm_open("/xyz", O_RDWR, 0);

if (shmid == -1)

ERR_EXIT("shm_open");

printf("shm_open succ\n");

struct stat buf;

if (fstat(shmid, &buf) == -1)

ERR_EXIT("fstat");

STU *p;

p = mmap(NULL, buf.st_size, PROT_WRITE, MAP_SHARED, shmid, 0);

if (p == MAP_FAILED)

ERR_EXIT("mmap");

strcpy(p->name, "test");

p->age = 20;

close(shmid);

return 0;

}

04shm_read.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/mman.h>

#include <sys/stat.h>        /* For mode constants */

#include <fcntl.h>           /* For O_* constants */

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#define ERR_EXIT(m) \

do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

typedef struct stu

{

char name[32];

int age;

} STU;

int main(void)

{

int shmid;

shmid = shm_open("/xyz", O_RDONLY, 0);

if (shmid == -1)

ERR_EXIT("shm_open");

printf("shm_open succ\n");

struct stat buf;

if (fstat(shmid, &buf) == -1)

ERR_EXIT("fstat");

STU *p;

p = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, shmid, 0);

if (p == MAP_FAILED)

ERR_EXIT("mmap");

printf("name=%s age=%d\n", p->name, p->age);

close(shmid);

return 0;

}

makefile:

.PHONY:clean all

CC=gcc

CFLAGS=-Wall -g

BIN=01shm_open 02shm_unlink 03shm_write 04shm_read

all:$(BIN)

%.o:%.c

$(CC) $(CFLAGS) -c $< -o [email protected]

01shm_open:01shm_open.o

$(CC) $(CFLAGS) $^ -o [email protected] -lrt

02shm_unlink:02shm_unlink.o

$(CC) $(CFLAGS) $^ -o [email protected] -lrt

03shm_write:03shm_write.o

$(CC) $(CFLAGS) $^ -o [email protected] -lrt

04shm_read:04shm_read.o

$(CC) $(CFLAGS) $^ -o [email protected] -lrt

clean:

rm -f *.o $(BIN)

POSIX 共享内存

时间: 2024-12-21 07:50:08

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把共享内存区映射到调用进程的地址空间中

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_unlin

linux网络编程之posix共享内存

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

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