登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux ipcmk 怎样创建指定大小的共享内存对象

来源:17golang原创

时间:2026-10-30 17:03:03 209浏览 收藏

创建System V共享内存段可使用 ipcmk -M 大小。例如 ipcmk -M 6MiB -p 0600请求创建6MiB的共享内存,并限制为所有者读写;如果直接写整数,则按字节指定。创建后记录命令返回的共享内存标识,再用它查看和清理对象。

官方地址:https://github.com/util-linux/util-linux

先明确共享内存类型与容量单位

准备进程间通信实验时,先把“对象类型、请求大小、访问权限”写清楚。只写“创建6M内存”容易让脚本维护者分不清二进制单位还是十进制单位,也不清楚目标程序使用哪一套IPC接口。

本文沿着参数语义、写法对照和兼容注意来解释,不把已有命令包装成新提案。所有命令都是供读者在Linux实验环境操作的示例,本文没有实际创建或删除本地共享内存。

大小写法请求字节数含义
62914566291456明确写出字节数
6MiB62914566乘以1024的平方
6MB60000006乘以1000的平方

脚本中更建议使用完整的MiB或MB后缀,或直接写字节数,让单位一眼可辨。util-linux手册给出了这两种单位体系的大小参数定义。

用-M创建System V共享内存段

# 创建一个6MiB的System V共享内存段,访问权限设为所有者读写
ipcmk -M 6MiB -p 0600

记下这次调用返回的共享内存ID,也就是后文使用的shmid。不要把其他终端里旧实验的ID拿来替代,更不要凭列表中的位置猜测刚创建的是哪一个。

等价的容量表达可以写成下面这样,但两段命令是二选一的示例:执行两次会创建两个对象。

# 与6MiB相同的请求大小,直接用字节表达
ipcmk -M 6291456 -p 0600

命令创建的是IPC资源,并没有替应用完成读写协议设计。双方如何找到对象、何时附加以及如何同步访问,仍是使用该资源的程序要约定的内容。

ipcmk大小权限与共享内存段属性的关系
静态说明图:命令参数分组中的-M与-p分别关联请求容量和权限,共享内存对象分组包含大小、模式与shmid;这不是终端截图。

按对象标识查看容量和权限

将实际ID填入变量,再针对这一项查看详情。下面采用Shell必填变量检查,避免空ID被忽略;它不是自动寻找“最新对象”的脚本。

# 先设置为刚才返回的数字ID,再执行详情查询
: "${SHMID:?请先把SHMID设置为本次创建的共享内存ID}"
ipcs -m -i "$SHMID"

ipcs -m选择共享内存资源,-i指定单个对象详情。观察ID、所有者、权限及大小,确认它对应本次实验记录。不要把shmid与进程PID混用;它们代表不同对象。选项说明见ipcs官方手册。

理解与POSIX对象的区别

这里使用大写 -M创建System V共享内存。当前上游手册还列出小写 -m的POSIX共享内存选项,并要求配合 -n提供名称。不要因为只有大小写差异,就把两种对象当成可以直接替换的资源。

目标机器的util-linux版本可能与上游master不同。采用POSIX选项前先阅读本机帮助;若没有该选项,应按应用实际接口与发行版工具能力选择做法,而不是把-M输出的ID冒充POSIX名称。

# 读取目标机器提供的选项,不创建IPC资源
ipcmk --help

项目记录建议至少保留“类型、容量单位、权限、对象标识”。对System V保存shmid;对POSIX保存名称。清理工具也应沿用同一对象类型,不要只看字符串像不像一个数字。

System V共享内存实验记录与精确查询清理关系
静态结构图:实验记录关联shmid、容量与权限,工具分组通过同一shmid定位查询和清理对象,不表示命令已经执行。

结束实验时精确清理

实验结束并确认相关程序不再需要这个对象后,按本次记录的ID清理。下列命令会请求移除指定共享内存,不应使用未经核对的ID。

# 只移除本次实验确认过的System V共享内存段
: "${SHMID:?请先把SHMID设置为本次创建的共享内存ID}"
ipcrm -m "$SHMID"

共享内存仍被进程附加时,最终移除要等到相关附加解除。删除权限与生命周期说明见ipcrm官方手册。一次实验应记录创建与清理是否完成,避免重复运行时留下无法归属的对象。

为什么6MiB与6MB不一样?

两者分别采用1024与1000为倍率。把大小统一换成字节后对照,比只比较终端里显示的“6M”更清楚。

默认权限是否一定适合实验?

上游手册默认模式为0644。示例显式指定0600,意在让权限选择可见;需要其他进程访问时,应根据运行身份和协作方式重新设计,不能只为解决访问错误而随意扩大权限。

创建成功是否说明两个进程已经共享数据?

创建资源只是准备工作。还需要应用正确连接对象并约定数据布局与同步方式,不能把创建回执当作通信完成的证明。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>