shm_open和mmap,以及共享内存
shm_open和mmap,以及共享内存
星期三, 12/31/2008 - 14:33 — ⽉⽩风清
因为海量的组件使⽤了共享内存,⽽⼜经常⽆缘⽆故的死掉,于是研究了⼀下Linux下的共享内存的使⽤,结果得到⼀点⼼得。
⾸先,从外表上看不出open()和shm_open()两种⽅式打开的共享⽂件的区别,除了后者打开的⽂件直接是放在/dev/shm⽬录下。⽽且对⽂件进⾏读写以后,⽂件真的就存在了,和普通⽂件没有什么区别的样⼦,cat⼀下还能cat出东西。后来再研究⼀下,好象/dev/shm这个⽬录是sticky directory,估计重新启动之后就会删除掉下⾯的东西。
第⼆,好象在使⽤mmap()得到的内存之前,必须保证⽂件的长度和指定的内存区域长度⼀样,否则直接memcpy到返回的内存去的时候会产⽣Bus error。
下⾯是⼀段⽰例代码。
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>mmap格式怎么打开
#include <unistd.h>
char *name = "/test";
int main(int args, char **argv) {
char *p;
int f = shm_open(name, O_RDWR|O_CREAT, S_IRWXU);
if (f < 0) {
perror("shm_open() failed.");
exit(1);
}
ftruncate(f, 1024);//没有这⾏会Bus error
p = mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_32BIT, f, 0);
if (!p) {
perror("mmap() failed");
exit(1);
}
memcpy(p, name, strlen(name) + 1);
exit(0);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。