http://tonybai.com/2005/09/23/apr-shmem/
匿名共享内存:
【1】
int N=1024; //大小
char *p = mmap(NULL, N, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED,-1,0);
p[0]='A';
p[a]='B';
...
mummap(p,N);
【2】
int N=1024; //大小
int fd=open("/dev/zero", O_RDWR);
char *p = mmap(NULL, N, PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);
...
munmap(p,N);
【3】
int N=1024;
int id=shmget(IPC_PRIVATE,N,0666);
char *p=shmat(id,NUL,0);
...
shmdt(p); //解除
shmctl(id,IPC_RMID,NULL); //拆除
有名共享内存:
【1】
int fd = open("abc", O_RDWR|O_CREAT|O_TRUNC, 0666); 或 un_link("abc");int fd = open("abc", O_RDWR|O_CREAT|O_EXCL, 0666);
ftruncate(fd,1024);
char *p = map(NULL,1024,PROT_READ|PROT_WRITE, MAP_SHARED, fd,0);
p[0]=...
munmap(p,1024);
un_link("abc");
【2】
int fd = shm_open("abc", O_RDWR|O_CREAT|O_TRUNC, 0666); 或 shm_unlink("abc");int fd = shm_open("abc", O_RDWR|O_CREAT|O_EXCL, 0666);
ftruncate(fd,1024);
char *p = map(NULL,1024,PROT_READ|PROT_WRITE, MAP_SHARED, fd,0);
p[0]=...
munmap(p,1024);
unlink("abc");
【3】key_t kt=ftok("abc",0);
int id=shmget(kt,1024,IPC_CREAT|0666);
char *p=shmat(id,NULL,0);
....
shmdt(p);
shmctl(id,IPC_RMID,NULL);
本文详细介绍了匿名共享内存和有名共享内存的实现方式,包括通过 mmap 和 shm 系列函数进行内存映射的方法,并展示了如何使用文件、设备节点及 IPC 机制来创建和管理共享内存。
1127

被折叠的 条评论
为什么被折叠?



