21、Posix共享内存
2011-09-18 11:07
363 查看
1、posix共享内存区涉及两个步骤:
1)指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。
2)调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。
2、函数
(1)创建
#include <sys/mman.h>
int shm_open(const char *name,int oflag,mode_t mode);
1)name 共享内存区的名字
2)oflag 标志位
3)mode 权限位,它指定O_CREAT标志的前提下使用。
(2)删除
int shm_unlink(const char *name);
(3)调整大小
普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。
int ftruncate(int fd,off_t length);
(4)查看状态
当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *file_name,struct stat *buf);
对于普通文件stat结构可以获得12个以上的成员信息,然而当fd指代一个共享内存区对象时,只有四个成员含有信息。
struct stat
{
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
};
g++ -g -o statt fstatt.cpp -lrt
3、示例
示例1
pshm_r
g++ -o pw pshm_w.cpp -lrt
参考
【1】 http://linux.die.net/man/3/shm_open
【2】 非常不错的中文man
http://cpp.ezbty.org/import_doc/linux_manpage/shm_unlink.3.html
http://cpp.ezbty.org/manpage
1)指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。
2)调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。
2、函数
(1)创建
#include <sys/mman.h>
int shm_open(const char *name,int oflag,mode_t mode);
1)name 共享内存区的名字
2)oflag 标志位
3)mode 权限位,它指定O_CREAT标志的前提下使用。
(2)删除
int shm_unlink(const char *name);
(3)调整大小
普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。
int ftruncate(int fd,off_t length);
(4)查看状态
当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *file_name,struct stat *buf);
对于普通文件stat结构可以获得12个以上的成员信息,然而当fd指代一个共享内存区对象时,只有四个成员含有信息。
struct stat
{
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
};
g++ -g -o statt fstatt.cpp -lrt
3、示例
示例1
pshm_r
#include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char **argv) { int shm_id; char *ptr; sem_t *sem; if(argc != 2) { printf("usage:shm_open <pathname>\n"); exit(1); } shm_id = shm_open(argv[1], O_RDWR | O_CREAT, 0644); ftruncate(shm_id, 100); sem = sem_open(argv[1], O_CREAT, 0644, 1); ptr = (char*)mmap(NULL, 100, PROT_READ | PROT_WRITE, MAP_SHARED, shm_id, 0); strcpy(ptr, "\0"); //清空共享内存区 while(1) { if((strcmp(ptr, "\0")) ==0) { continue; } else { if((strcmp(ptr, "q\n"))==0) break; sem_wait(sem); printf("server:%s", ptr); strcpy(ptr, "\0"); sem_post(sem); } sem_unlink(argv[1]); shm_unlink(argv[1]); } }
g++ -o pw pshm_w.cpp -lrt
参考
【1】 http://linux.die.net/man/3/shm_open
【2】 非常不错的中文man
http://cpp.ezbty.org/import_doc/linux_manpage/shm_unlink.3.html
http://cpp.ezbty.org/manpage
相关文章推荐
- linux网络编程之posix共享内存
- Linux IPC实践(10) --Posix共享内存
- Linux下基于POSIX标准的共享内存操作示例
- Linux IPC实践(10) --Posix共享内存
- POSIX 线程 一种支持内存共享的简捷工具
- POSIX 线程详解(一) 一种支持内存共享的简捷工具
- Linux下基于POSIX标准的共享内存操作示例
- IPC之Posix共享内存详解
- Linux IPC实践(10) --Posix共享内存
- Linux进程通信之POSIX共享内存
- Linux进程通信之POSIX共享内存
- 缓冲区设计—进程间通讯(POSIX 共享内存)
- Linux 多线程编程( POSIX )( 六 )----->代码区 ( 共享内存实例 )
- 进程间通信(8) - 共享内存(posix)
- Posix多线程编程学习笔记(六)—共享内存(1)
- 细说linux IPC(四):posix 共享内存
- POSIX 线程 一种支持内存共享的简捷工具
- Posix多线程编程(6)—共享内存
- POSIX中有亲缘关系的进程之间的匿名内存共享的简单实例
- Posix多线程编程学习笔记(六)—共享内存(1)