二级域名注册平台南通优化网站

当前位置: 首页 > news >正文

二级域名注册平台,南通优化网站,wordpress 支付下载,西安知名的集团门户网站建设服务商在上一篇博客中#xff0c;对Linux系统编程部分的IPC对象—消息队列的知识点进行了讲解梳理#xff0c;本文紧接着上一篇博客的内容#xff0c;这篇博文笔记文章继续对Linux系统编程中IPC对象部分的共享内存的常见知识体系做梳理。 1、IPC共享内存 (1)、基本概念 共享内存…        在上一篇博客中对Linux系统编程部分的IPC对象—消息队列的知识点进行了讲解梳理本文紧接着上一篇博客的内容这篇博文笔记文章继续对Linux系统编程中IPC对象部分的共享内存的常见知识体系做梳理。 1、IPC共享内存 (1)、基本概念 共享内存shared memory是最简单的Linux进程间通信方式之一。共享内存顾名思义就是使不同的进程共享一段相同的内存来达到通信的目的由于SHM对象不再交由内核托管因此共享内存SHM对象是众多IPC方式最高效的一种方式但也因为这个原因SHM一般不能单独使用而需要配合诸如互斥锁、信号量等协同机制使用。 通俗易懂的来说因为所有的进程对共享内存的访问就和访问自己的内存空间一样而不需要进行额外系统调用或内核操作同时还避免了多余的内存拷贝所以这种方式是效率最高、速度最快的进程间通信方式。 其他的进程间通信方式需要将用户的数据拷贝到内核态在由内核态将数据拷贝到用户态。共享内存简少了内核态与用户态之间的数据拷贝过程。 机制任意两个进程通过申请key值ID号共享内存得到一片内存空间那么这两个进程就可以将数据写入到共享内存/读取共享内存上的数据进行数据的交换。 (2)、共享内存工作原理 共享内存是基于Linux操作系统的内存管理实现的。创建共享内存空间后Linux内核将不同进程的虚拟地址都映射到同一个页面所以在不同进程中对共享内存所在的内存地址的访问最终都被映射到同一页面。 IPC对象的共享内存实现步骤如下 ①创建共享内存区域 ②映射共享内存 ③数据共享 ④解除映射 ⑤删除共享内存 2、共享内存API接口 (1)、ftok //函数原型 #include sys/types.h #include sys/ipc.h key_t ftok(const char *pathname, int proj_id);//函数功能 ​​生成一个唯一的 key 值​​用于标识 IPC 资源//函数参数 pathname一个已经存在的文件路径用于计算 key 值 proj_id​​项目 ID用于区分不同的 IPC 资源//函数返回值 成功返回key值 失败返回-1并设置errno (2)、shmget //函数原型 #include sys/ipc.h #include sys/shm.h int shmget(key_t key, size_t size, int shmflg);//函数功能 用于创建或访问一个System V的共享内存段Shared Memory Segment//函数参数 key共享内存段的键值用于标识一个全局唯一的共享内存段 size指定共享内存段的大小以字节为单位 shmflg标志位IPC_CREAT如果不存在与 key 对应的共享内存段则创建一个新的IPC_EXCL必须与IPC_CREAT一起使用表示如果已存在该key的共享内存段则返回错误//函数返回值成功返回一个非负整数即共享内存段的标识符shmid失败返回返回 -1并设置errno 表示错误原因 (3)、shmat //函数原型 #include sys/types.h #include sys/shm.h void *shmat(int shmid, const void *shmaddr, int shmflg);//函数功能 shmatSHared Memory ATtach用于将一个共享内存段映射附加到调用进程的地址空间。一旦附加成功进程就可以像访问普通内存一样读写这块共享内存实现与其他进程的数据共享。//函数参数 shmid共享内存段标识符由shmget返回。 shmaddr指定共享内存段在当前进程地址空间中的期望映射地址。通常设为NULL表示由系统自动选择合适的地址。 shmflg标志位常用的标志有SHM_RDONLY只读方式附加共享内存SHM_REMAP允许重映射一个已经映射的区域不常用//函数返回值成功返回指向共享内存段在进程地址空间中起始位置的指针类型为 void *后续可以通过该地址进行读写操作。失败返回 (void *)-1并设置 errno 表示错误原因。 (4)、shmdt //函数原型 #include sys/types.h #include sys/shm.h int shmdt(const void *shmaddr);//函数功能 shmdtSHared Memory DeTach用于将之前通过 shmat 映射到当前进程地址空间的共享内存段从该进程中分离解除映射。 调用这个函数不会删除共享内存段本身只是将当前进程与共享内存的关联断开。其他仍然附加了该共享内存的进程仍可继续访问它。//函数参数 shmaddr 指向共享内存段在当前进程中映射地址的指针这个地址是由 shmat 返回的值。//函数返回值成功返回 0。失败返回 -1并设置 errno 表示错误原因。 (5)、shmctl //函数原型 #include sys/ipc.h #include sys/shm.h int shmctl(int shmid, int cmd, struct shmid_ds *buf);//函数功能 shmctlSHared Memory ConTroL用于对共享内存段执行各种控制操作。这是一个多功能的接口可以用来获取或设置共享内存段的状态信息也可以删除共享内存段。//函数参数 shmid共享内存段标识符由 shmget 返回。 cmd控制命令指定要执行的操作。常用命令如下IPC_STAT从内核中读取该共享内存段的状态信息并将其保存到 buf 指向的struct shmid_ds 结构体中。IPC_SET将 buf 中的信息设置到共享内存段的内核结构中常用于修改权限等属性。IPC_RMID标记该共享内存段为“待删除”。当所有附加该段的进程都分离后系统会真正删除该段。buf指向一个 shmid_ds 结构体的指针用于存储或提供共享内存段的状态信息。如果 cmd 是 IPC_RMID则此参数可设为 NULL。//函数返回值成功返回 0。失败返回 -1并设置errno 表示错误原因。 3、程序应用举例 (1)、写数据到共享内存 ipc_mem_write.c #includestdio.h #include sys/types.h #include string.h #include sys/types.h #include sys/ipc.h #include sys/shm.h//进程1int main() {//1、申请key值 key_t key ftok(.,10);//2、根据key值 得到物理共享内存的ID号如果该物理内存不存在则创建 —openint shmid shmget(key,1024,IPC_CREAT|0666);printf(共享内存 key:%#x shmid:%d\n,key,shmid);//3、将物理内存 映射到 用户的虚拟内存空间中的某一块区域charshm_p shmat(shmid,NULL,0);if(shm_p (void)-1){perror(shmat error);return -1;}//4、直接往这块内存进行赋值(写入数据)//可以不断从键盘上获取数据当输入exit的时候退出char sendbuf[1024] hello world;memcpy(shm_p,sendbuf, strlen(sendbuf));printf(Write data:%s\n, sendbuf); while(1);//5、最后不用的时候解除 映射 shmdt(shm_p);return 0; } (2)、读取共享内存数据 ipc_mem_read.c #includestdio.h #include sys/types.h #include string.h #include sys/types.h #include sys/ipc.h #include sys/shm.h //进程2int main() {//1、申请key值 key_t key ftok(.,10);//2、根据key值 得到物理共享内存的ID号如果该物理内存不存在则创建 —openint shmid shmget(key,1024,IPC_CREAT|0666);printf(共享内存 key:%#x shmid:%d\n,key,shmid);//3、将物理内存 映射到 用户的虚拟内存空间中的某一块区域charshm_p shmat(shmid,NULL,0);if(shm_p (void)-1){perror(shmat error);return -1;}//4、直接往这块内存读取数据//不断地读取数据当获取到exit的时候退出printf(Read data:%s\n,shm_p);while(1);//5、最后不用的时候解除 映射 shmdt(shm_p);return 0; }共享内存通信效果演示图