shmget报错Invalid argument

shmget报错Invalid argument一 先看测试代码 include include include includeusing intmain intkey intkey intsize intrtn shmget key size IPC CREAT 0666

一、先看测试代码

#include 
  
    #include 
   
     #include 
    
      #include 
     
       using namespace std; int main() { //int key=; int key=; int size=; int rtn = shmget(key,size,IPC_CREAT|0666); cout <<"rtn="< 
       
      
     
    
  


运行结果: mkshm error ! errno=22 , errmsg=Invalid argument .

通过度娘终于知道原因:申请的共享内存空间超过了系统限制

代码申请大约100M共享内存,而系统共享内存上限只有32M:

cat /proc/sys/kernel/shmmax




二、修改共享内存上限值

建议将共享内存的上限值设为物理内存的一半,把共享内存大小设置为256MB。

临时修改(重启失效):
sysctl -w kernel.shmmax=

永久修改: 
root权限vi /etc/sysctl.conf系统配置文件: 
kernel.shmmax =
执行sysctl -p使修改的配置生效 





















三、shmget函数简介

shmget简介
头文件 #include < sys/ipc.h >
#include


函数功能 得到一个现有的共享内存标识符或创建一个新的共享内存并返回其标识符
函数原型 int shmget(key_t key, size_t size, int shmflg)
参数详解
key IPC_PRIVATE(0):建立新共享内存对象
大于0的32位整数:视参数shmflg来确定操作。通常要求此值来源于ftok返回的IPC键值
size 大于0的整数:新建的共享内存大小,以字节为单位
0:只获取共享内存时指定为0
shmflg 0:取共享内存标识符,若不存在则函数会报错
IPC_CREAT:如果内核中不存在键值与key相等的共享内存,则新建;如果存在,返回此共享内存的标识符
IPC_CREAT|IPC_EXCL:如果不存在键值与key相等的共享内存,则新建共享内存;如果存在则报错
IPC_CREAT|mode_flags:mode_flags组成最低9bits指明所有者、同组用户和其他用户对共享内存的访问权限
函数返回值 成功:返回共享内存的标识符
出错:-1,错误原因存于error中
错误代码 EINVAL:参数size小于SHMMIN或大于SHMMAX
EEXIST:预建立key所指的共享内存,但已经存在
EIDRM:参数key所指的共享内存已经删除
ENOSPC:超过了系统允许建立的共享内存的最大值(SHMALL)
ENOENT:参数key所指的共享内存不存在,而参数shmflg未设IPC_CREAT位
EACCES:没有权限
ENOMEM:核心内存不足












创建一个用于父子进程间通信的共享内存我们可以这样子进行创建:

shmid shmid=shmget(IPC_PRIVATE,shmSize,IPC_CREAT|0640));

参考博客:http://blog.csdn.net/K346K346/article/details/




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214449.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:14
下一篇 2026年3月18日 下午4:14


相关推荐

  • python 字典操作提取key,value

    python 字典操作提取key,valuepython 字典操作提取 key valuediction key value1 为字典增加一项 2 访问字典中的值 3 删除字典中的一项 4 遍历字典 5 字典遍历的 key value6 字典的标准操作符 7 判断一个键是否在字典中 8 python 中其他的一些字典方法 9 将两个字典合并 a a 1

    2026年3月20日
    2
  • 一文读懂宏基因组分析套路

    一文读懂宏基因组分析套路很多亲人感觉宏基因组的分析结果内容种类太多,根本学不过来。其实本质上并不复杂,只分为两类:物种组成和功能组成两大类,这是核心结果;再加上开头系统描述和结尾的讨论比较。通常会出现固定套路的4部分结构。今天就从之前解决的1篇nature,2篇science,入手来总结宏基因组分析的基本思路。只有分析思路清楚,结果才更容易説清楚。文章思路和结果文章分析思路:整体概述——物种组成——功…

    2022年6月11日
    45
  • CListCtrl大数据显示[通俗易懂]

    CListCtrl大数据显示[通俗易懂]CListCtrl是个很方便的东西,但是当数据大到一个程度(比如说10万条数据),显示速度就会非常的慢。解决办法就是用虚拟列表。CListCtrl显示数据的原理是将需显示的所有数据拷贝在它内部的一块空间里,然后显示出来。一但数据量过大,拷贝的时间就会延长,显示速度当然也就非常慢了。而虚拟列表则不需要将显示数据拷贝到内部空间,它的做法是当需要显示某个数据时,才将数据拷入内部空间。看上去好像和普通CLi

    2022年6月23日
    29
  • golang 字符串 转 时间类型[通俗易懂]

    golang 字符串 转 时间类型[通俗易懂]实例如下:local,_:=time.LoadLocation(“Asia/Shanghai”)showTime,_:=time.ParseInLocation(“2006-01-0215:04:05″,”2021-11-0711:34:00”,local)fmt.Println(showTime)showTime,_=time.ParseInLocation(“2006-01-02″,”2021-11-07”,local)fmt.Println(showTime

    2022年5月8日
    39
  • java session有效期设置方式「建议收藏」

    java session有效期设置方式「建议收藏」session默认有效期是30分钟,设置session的有效期有三种方法:1.在tomcat中的server.xml中定义:在tomcat中的conf/server.xml文件可以修改服务器上的所有程序的默认有效期,设置单位为毫秒,定义代码如下:<Contextpath=”/test”docBase=”/test”  defaultSessionTimeOut=”360…

    2022年7月12日
    18
  • COM组件和调用

    COM组件和调用COM 组件和调用 1 引言 2 实验环境 3 COM 组件介绍 4 实验过程 4 1 利用 C 创建一个 COM 组件 4 1 1 项目创建 4 1 2 配置项目属性功能快捷键合理的创建标题 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右 SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的 KaTeX 数学公式新的甘特图

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号