Home Article Practice 07_共享内存

07_共享内存

2024-04-26 14:20  views:283  source:拼搏百天我要上蓝翔    

知识点1【mmap存储映射】(了解)1、mmap概述存储映射I/O (Memory-mapped I/O) 使
一个磁盘文件与存储空间中的一个缓冲区相映射。是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据
存入缓冲区,则相应的字节就自动写入文件2、mmap的API1、建立文件和内存的映射1 #include <sy
s/mman。h>2 void *mmap(void *addr, size_t length, int pr
ot, int flags,3 int fd, off_t offset);addr 地址,填NULLleng
th 长度 要申请的映射区的长度prot 权限PROT_READ 可读PROT_WRITE 可写flags 标
志位MAP_SHARED 共享的 -- 对映射区的修改会影响源文件MAP_PRIVATE 私有的fd 文件描述
符 需要打开一个文件offset 指定一个偏移位置 ,从该位置开始映射返回值成功 返回映射区的首地址失败 返回
MAP_FAILED ((void *) -1)2、拓展文件大小1 #include <unistd。h>2
#include <sys/types。h>3 int truncate(const char *path,
off_t length);path 要拓展的文件length 要拓展的长度3、释放映射区域(只能解除本进程
的映射)1 int munmap(void *addr, size_t length);addr 映射区的首地
址length 映射区的长度返回值成功 返回0失败 返回 -13、案例00_write。c1 #include
<stdio。h>2 #include <sys/types。h>3 #include <sys/stat。
h>4 #include <fcntl。h>5 #include <sys/mman。h>6 #include
<unistd。h>7 #include <string。h>8 int main(int argc, ch
ar const *argv[])9 {10 //通过open事先打开文件11 int fd = open("
tmp", O_RDWR | O_CREAT, 0666);12 if (fd < 0)13 {14 perr
or("open");15 return 0;16 }1718 //拓展文件大小19 truncate("tm
p", 16);2021 //建立映射22 char *buf = (char *)mmap(NULL, 16
, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2324 //使用区
域25 strcpy(buf, "hello mmap");2627 //断开映射28 munmap(buf,
16);2930 return 0;31 }3200_read。c1 #include <stdio。h>2
#include <sys/types。h>3 #include <sys/stat。h>4 #includ
e <fcntl。h>5 #include <sys/mman。h>6 #include <unistd。h>
7 int main(int argc, char const *argv[])8 {9 //通过open事先
打开文件10 int fd = open("tmp", O_RDWR | O_CREAT, 0666);11
if (fd < 0)12 {13 perror("open");14 return 0;15 }1617 /
/拓展文件大小18 truncate("tmp", 16);1920 //建立映射21 char *buf =
(char *)mmap(NULL, 16, PROT_READ | PROT_WRITE, MAP_SHA
RED, fd, 0);2223 //使用区域24 printf("%s\n", buf);2526 //断开
映射27 munmap(buf, 16);2829 return 0;30 }31知识点2【共享内存】(了解)
1、共享内存的概述共享内存允许两个或者多个进程共享给定的存储区域。共享内存的特点1、共享内存是进程间共享数据的
一种最快的方法。 一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。2、
使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。 若一个进程正在向共享内存区写数据,则在它做完这
一步操作前,别的进程不应当去读、写这些数据。共享存储区的最小字节数:1共享存储区的最大字节数:32M共享存储区
的最大个数:4096每个进程最多能映射的共享存储区的个数:40962、API1、获得一个唯一共享存储标识符1
#include <sys/ipc。h>2 #include <sys/shm。h>3 int shmget(
key_t key, size_t size,int shmflg);功能:创建或打开一块共享内存区参数:ke
y:IPC键值size:该共享存储段的长度(字节)shmflg:标识函数的行为及共享内存的权限。参数:shmf
lg:IPC_CREAT:如果不存在就创建IPC_EXCL:如果已经存在则返回失败位或权限位:共享内存位或权限
位后可以设置共享内存的访问权限,格式和open函数的mode_t一样,但可执行权限未使用。返回值:成功:返回共
享内存标识符。失败:返回-1使用shell命令操作共享内存: 查看共享内存 ipcs -m 删除共享内存 ip
crm -m shmid2、建立进程的虚拟内存 和 物理内存大的映射共享区映射:1 #include <sys
/types。h>2 #include <sys/shm。h>3 void *shmat(int shmid,
const void *shmaddr,int shmflg);功能:将一个共享内存段映射到调用进程的数据段
中。参数:shmid:共享内存标识符。shmaddr:共享内存映射地址(若为NULL则由系统自动指定),推荐使
用NULL。shmflg:共享内存段的访问权限和映射条件0:共享内存具有可读可写权限。SHM_RDONLY:只
读。SHM_RND:(shmaddr非空时才有效)没有指定SHM_RND则此段连接到shmaddr所指定的地址
上(shmaddr必需页对齐)。指定了SHM_RND则此段连接到shmaddr- shmaddr%SHMLBA
所表示的地址上。返回值:成功:返回共享内存段映射地址失败:返回 -1注意:shmat函数使用的时候第二个和第
三个参数一般设为NULL和0,即系统自动指定共享内存地址,并且共享内存可读可写3、解除共享映射区:1 #inc
lude <sys/types。h>2 #include <sys/shm。h>3 int shmdt(con
st void *shmaddr);功能:将共享内存和当前进程分离(仅仅是断开联系并不删除共享内存)。参数:s
hmaddr:共享内存映射地址。返回值:成功返回 0,失败返回 -1。4、共享内存控制:1 #include
<sys/ipc。h>2 #include <sys/shm。h>3 int shmctl(int shmid
, int cmd, struct shmid_ds *buf);功能:共享内存空间的控制。参数:shmid:
共享内存标识符。cmd:函数功能的控制。buf:shmid_ds数据类型的地址,用来存放或修改共享内存的属性。
cmd:函数功能的控制IPC_RMID:删除。IPC_SET:设置shmid_ds参数。IPC_STAT:保存
shmid_ds参数。SHM_LOCK:锁定共享内存段(超级用户)。SHM_UNLOCK:解锁共享内存段。返回
值:成功返回 0,失败返回 -1。3、案例02_write。c1 #include <stdio。h>2 #i
nclude <sys/types。h> //ftok3 #include <sys/ipc。h> //fto
k4 #include <sys/shm。h> //shmget5 #include <string。h>6
int main(int argc, char const *argv[])7 {8 //获取唯一的key9
key_t key = ftok("/", 2022);1011 //获取共享内存的标示(分配物理内存)12
int shm_id = shmget(key, 32, IPC_CREAT | 0666);1314 //将
虚拟内存 和 物理内存 建立映射15 char *buf = (char *)shmat(shm_id, NU
LL, 0);1617 //操作虚拟内存18 strcpy(buf, "hello shm");1920 //
释放映射21 shmdt(buf);22 return 0;23 }2403_read。c1 #include
<stdio。h>2 #include <sys/types。h> //ftok3 #include <sy
s/ipc。h> //ftok4 #include <sys/shm。h> //shmget5 #includ
e <string。h>6 int main(int argc, char const *argv[])7 {
8 //获取唯一的key9 key_t key = ftok("/", 2022);1011 //获取共享内存
的标示(分配物理内存)12 int shm_id = shmget(key, 32, IPC_CREAT |
0666);1314 //将虚拟内存 和 物理内存 建立映射15 char *buf = (char *)sh
mat(shm_id, NULL, 0);1617 //操作虚拟内存18 printf("%s\n", buf
);1920 //释放映射21 shmdt(buf);22 return 0;23 }



Disclaimer: The above articles are added by users themselves and are only for typing and communication purposes. They do not represent the views of this website, and this website does not assume any legal responsibility. This statement is hereby made! If there is any infringement of your rights, please contact us promptly to delete it.

字符:    改为:
去打字就可以设置个性皮肤啦!(O ^ ~ ^ O)