shmget出现Invalid argument错误
1.shmget函数简介
shmget简介 | ||
---|---|---|
头文件 |
#include < sys/ipc.h > #include <sys/shm.h> |
|
函数功能 | 得到一个现有的共享内存标识符或创建一个新的共享内存并返回其标识符 | |
函数原型 | 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:核心内存不足 |
了解shmget之后,创建一个用于父子进程间通信的共享内存我们可以这样子进行创建:
shmid shmid=shmget(IPC_PRIVATE,shmSize,IPC_CREAT|0640));
2.Invalid argument错误
出错的代码:
long int shmSize=1024\*1024\*1024;
if(shmid=shmget(IPC_PRIVATE,shmSize,IPC_CREAT|0640))<0)
{cout<<"errno:"<<errno<<" shmget error:"<<strerror(errno)<<endl;if(EINVAL==errno)cout<<"too large shmsize"<<endl;
}
打印输出:
通过测试可知,该错误是由于开辟共享内存空间超过了系统限制。我们可以通过shell命令查看共享内存上限值:
cat /proc/sys/kernel/shmmax
3.修改共享内存上限值
很多Linux系统缺省最大共享内存是 32 MB,我们可以通过如下方式进行修改。
临时修改:
建议将共享内存的上限值设为物理内存的一半,在root权限下执行以下命令,把共享内存大小设置为256MB:
echo 268435456 > /proc/sys/kernel/shmmax
或者:
sysctl -w kernel.shmmax=268435456
永久修改:
方法一:
临时修改在电脑重启后将失效,可以将以上命令加入/etc/rc.local文件中的最后一行,保证系统启动时自动执行rc.local中的命令。
/etc/rc.local是Linux主机的shell脚本文件,类似于Windows的自启动菜单,系统开机时自动加载执行。
注意,rc.local文件在Ubuntu中的路径是/etc/rc.local,在Red Hat系列系统中的路径是:/etc/rc.d/rc.local。
方法二:
将一下内容写入/etc/sysctl.conf系统配置文件中。
kernel.shmmax = 268435456
/etc/sysctl.conf文件主要是配置一些系统信息,而且它的内容全部对应于/proc/sys/这个目录的子目录及文件。
注意,修改/etc/sysctl.conf文件后,不会立即生效,我们可以执行一下命令使修改的配置生效。
sysctl -p
申明一点,修改共享内存上限值的相关操作均需要root权限。
参考文献
[1]http://blog.csdn.net/mmz_xiaokong/article/details/8706272
[2]http://blog.csdn.net/cat_lover/article/details/6742268
[3]http://linxucn.blog.51cto.com/1360306/740130
shmget出现Invalid argument错误相关推荐
- python使用open的OSError: [Errno 22\] Invalid argument错误
打开的文件名中含有一些系统的敏感字符,结果就报错了.看一段简单的代码: title = '把我看成新闻的*标题吧.' contetn = '就把我看成是新闻的内容吧!!!' with open(tit ...
- OSError: [Errno 22] Invalid argument:错误
** OSError: [Errno 22] Invalid argument:错误 ** 描述: 本来下载音乐很正常,但是重新调试之后就会报这个错 也可能是必然的,我就想下一首网易云的can we ...
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
使用TCP套接字时,当无网络连接时,还会继续send,继续recv阻塞,知道TCP自己协议机制判断断开连接时才会停止发送和接收,时间需要几分钟之久. 解决的办法是,自己设置接收超时时间,当超时后重新发 ...
- python invalid argument_python使用open的OSError: [Errno 22] Invalid argument错误
这两天在写一个新闻类的spider时,遇到了OSError: [Errno 22] Invalid argument这个错误,苦恼的两天,无果.后来通过请教学长,发现原来是打开的文件名中含有一些系统的 ...
- C语言使用多播/组播IP_ADD_MEMBERSHIP出现Invalid argument错误解决方法
UDP练习遇到的问题 (1)在组播/多播开发练习过程中,使用setsockopt函数来添加多播组的时候,调用完成后返回值一直为-1.返回-1后,使用perror打印出错的原因.打印结果如下: **se ...
- OSError: [Errno 22] Invalid argument错误解决方案
在做文件读取写入操作的时候遇见OSError: [Errno 22] Invalid argument: 'F:\\pythonProject\\Api\\common\\2022-03-11_15: ...
- 在虚拟机下运行gazebo,关于vmw_ioctl_command error Invalid argument错误
开发环境:windows10+vmware player+ubuntu14.04+ROS indigo 运行:gazebo 前提条件:安装gazebo: sudo apt-get install ro ...
- 昇腾 OSError: [Errno 22] Invalid argument: ‘protocol‘
OSError: [Errno 22] Invalid argument: 'protocol' 改为这样不报错,但是报别的错: def __init__(self, family=-1, type= ...
- Python OSError: [Errno 22] Invalid argument:的出现和解决
1.在学习从文件读取数据中,写了个示例代码,读取不在同一个目录的file.txt,运行后报这个Python OSError: [Errno 22] Invalid argument:错误: (1).首 ...
最新文章
- Linux上安装paramiko模块
- 空间金字塔池化_CVPR 2018 | 旷视科技人体姿态估计冠军论文——级联金字塔网络CPN...
- mvc html validator,ASP.NET MVC实现Validation验证器扩展
- SQL2012 附加数据库提示5120错误解决方法
- js中的数组基本知识
- 喜报|聚焦信创——360云计算管理平台生态建设的又一里程碑!
- python 多列对齐_python – 如何连接两个数据帧并在这样的特定列上对齐?
- LeetCode刷题(20)
- Flask 使用abort方法返回http错误码、http错误响应信息
- idea 一直不停的updating index
- 单节点部署gpmall商城系统
- 腾讯云iis8.5新建网站无法访问_如何建立自己的网站(零基础小白教程一)
- 扎心了!互联网公司福利缩水指南
- ubuntu18.04添加自定义分辨率
- Python 实现子域名查询与爆破
- 本人的博客迁移到多个平台,小伙伴们多多支持……
- Altium Designer15通用规则设置
- mysql24小时分组
- 华为开源操作系统鸿蒙开源地址链接
- IPMSG(飞秋)源代码调试笔记