首页手机linux共享内存的使用 linux共享内存详解

linux共享内存的使用 linux共享内存详解

圆圆2025-06-21 13:00:56次浏览条评论

【linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作

一.共享内存概述及相关指令

共享内存共享内存(Shared)内存)是一种允许多个进程访问相同块内存空间的机制。这种技术常用于进程间通信(IPC)和数据共享,因为它提供了一种高效的来提交大量数据,而消耗方式通过内核进行数据的复制。在共享内存模型中,多个或多个进程可以将相同块物理内存映射到它们各自的地址空间中。这意味着,当一个进程向这内存块写入数据时,其他进程可以立即看到这些更改,因为它们实际上是在访问相同的内存位置。

共享内存文件所在目录代码:javascript代码运行次数:0/dev/shm登录后复制

查看共享内存文件属性代码:javascript代码运行次数:0stat /my_shared_memory登录后复制

查看共享文件内容代码语言:代码javascript运行次数:0hd /my_shared_memory登录后复制

以0共享覆盖文件代码语言:javascript代码运行次数:0dd /my_shared_memory登录后复制

二.共享内存相关函数

shm_open()函数shm_open()函数用于创建或打开一个命名的共享内存对象,并返回一个文件路径,即shm_fd。该函数的原型如下:代码语言:javascript代码运行次数:0int shm_open(const char *name, int oflag, mode_t mode);name:共享内存对象的名称,这个名称必须以斜杠(/)开头,并且不能包含其他斜杠。例如,quot;/my_shared_memoryquot;是一个的名称。oflag:打开标志,可以是O_RDONLY(眼神)、O_RDWR(读写)或O_CREAT(如果对象不存在合法创建它)等标志的组合。mode:当oflag包含O_CREAT 此时,这个参数指定了新创建的共享内存对象的权限。例如:0666:对象的目录权限。rw-rw-rw-====110 110 110登录后复制

ftruncate()函数ftruncate()用于设置共享内存大小的函数。代码语言:javascript代码运行次数:0ftruncate(shm_fd, 4096); //将共享内存大小设置为4KB登录后复制

mmap()函数mmap()函数将一个文件或者其他对象映射进内存,文件被映射到多个上页。通过mmap()映射后,用户可以直接操作虚拟地址进行文件的读写等操作,而不必再调用read()、write()等系统调用。代码语言:javascript代码运行次数:0void* mmap(void* addr, size_t length, int prot, int标志,int fd,off_t offset);addr:通常是映射区的开始地址。设置为NULL,让系统自动选择地址长度:映射区的长度prot:期望的内存保护标志,不能与文件的打开模式冲突。以下值的组合可以: PROT_EXEC:页内容可以被执行。 PROT_READ:页内容可以被读取。 PROT_WRITE:页可以被读取。

PROT_NONE:页不可访问。flags:指定映射对象的类型、映射选项和映射有效是否可以共享。fd:的文件描述词。如果设置MAP_ANONYMOUS,为了兼容问题,其值应为-1。offset:被映射对象的内容的起点。登录后复制

【1】利用mmap()函数向共享内存读取数据使用mmap()函数将共享内存映射到进程的地址空间,然后通过指针操作来读取数据。例如:代码语言:javascript代码运行次数:0int shm_fd;char* ptr;shm_fd = shm_open(quot;/my_shared_memoryquot;, O_RDWR, 0666);//O_RDWR读写ptr = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, shm_fd, 0);//PROT_WRITE:页面可以被写入memcpy(ptr, quot;您好, World!\0quot;, 13);//sprintf(ptr,quot;squot;,quot;Helloquot;);登录后复制

【2】利用 mmap() 函数从共享内存访问和读取数据 使用 mmap() 函数将共享内存映射到进程的地址空间,然后通过显示器操作来读取访问数据。例如:代码语言:javascript代码运行次数:0int shm_fd;char* ptr;//使用printf访问数据shm_fd = shm_open(quot;/my_shared_memoryquot;, O_RDWR, 0666);//O_RDWR写入ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, shm_fd, 0);//PROT_READ:页面内容可以被读取printf(quot;s\nquot;,ptr);//使用read()函数读取数据 char *buf = (char *)malloc(64);lseek(shm_fd, 0, SEEK_SET); // 将文件指针重新定位到文件开头read(shm_fd, buf, 13);登录后复制

close()函数和shm_unlink()函数close()用于关闭文件顶部的函数,shm_unlink()用于删除命名的共享内存对象的函数。当不再需要使用共享内存时,应该关闭shm_fd 并释放相关资源。这可以通过调用 close() 函数和 shm_unlink() 函数来实现。注意,shm_unlink() 并不会立即释放共享内存,直到所有访问该共享内存的进程都退出后,才会被真正释放。代码语言:javascript代码运行次数:0close(shm_fd); // 关闭文件然后shm_unlink(quot;/my_shared_memoryquot;); // 删除命名的共享内存对象登录后复制

三.模拟实现不同的进程把hellochar对的放入和取出操作

注意:编译不通过的情况(linux版本过低,加上-lrt)

注:编译时如果不通过(未定义的引用),考虑LINUX版本问题。解决:编译后面加上-lrt。

代码语言:javascript代码运行次数:0gcc Consumer.c -o Consumer.out -lrt登录后复制

进程0:共享内存对象创建和初始化代码语言:javascript代码运行次数:0#include lt;sysgt;#include lt;fcntl.hgt;#include lt;unistd.hgt;void main(){ int shm_fd;lt;pre class=quot;画笔:php;工具栏:falsequot;gt;shm_fd = shm_open(quot;/my_shared_memoryquot;, O_RDWR, 0666);//O_RDWR 读写ftruncate(shm_fd, 4096); //将共享内存大小设置为4KB登录后复制

}

进程1:把hello字符往存放代码:javascript代码运行次数:0#include lt;sysgt;lt;/pgt;lt;h1gt;include lt;fcntl.hgt;lt;/h1gt;lt;h1gt;include lt;unistd.hgt;lt;/h1gt;lt;pgt;void main(){int shm_fd;char* ptr;lt;/pgt;lt;pre class=quot;brush:php;toolbar:falsequot;gt;shm_fd = shm_open(quot;/my_shared_memoryquot;, O_RDWR, 0666);//O_RDWR读写ptr = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, shm_fd, 0);//PROT_WRITE:页写入 sprintf(ptr,quot;squot;,quot;Helloquot;);登录后复制

}

进程2:把hello字符从取出(模拟)代码语言:javascript代码运行次数:0#include lt;sysgt;lt;/pgt;lt;h1gt;include lt;fcntl.hgt;lt;/h1gt;lt;h1gt;include lt;unistd.hgt;lt;/h1gt;lt;pgt;void main(){int shm_fd;char* ptr;//使用printf访问数据shm_fd = shm_open(quot;/my_shared_memoryquot;, O_RDWR, 0666);//O_RDWR读写ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, shm_fd, 0);//PROT_READ:页面内容可以被读取printf(quot;s\nquot;,ptr);}登录后复制

进程3:进程0创建的共享文件/dev/shm/my_shared_memory语言代码:javascript代码运行次数:0#include lt;sysgt;lt;/pgt;lt;h1gt;include lt;fcntl.hgt;lt;/h1gt;lt;h1gt;include lt;unistd.hgt;lt;/h1gt;lt;pgt;voi

d main(){shm_unlink(quot;/my_shared_memoryquot;); //删除抽取的共享内存对象}登录后复制

以上就是【Linux】<共享内存应用>——模拟不同进程把hello字符对<共享内存文件对象>的传入和取出操作的详细,更多请关注乐哥常识网其他相关内容文章!

【Linux】<共享
vscode代码结构插件 vscode代码结构分析图
相关内容
发表评论

游客 回复需填写必要信息