shmget报EEXIST错误
来源:互联网 发布:php类中定义一个结构体 编辑:程序博客网 时间:2024/06/03 23:44
一、shmget(得到一个共享内存标识符或创建一个共享内存对象)
1. 所需头文件
#include <sys/ipc.h>
#include <sys/shm.h>
2. 函数说明
得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符
3. 函数原型
int shmget(key_t key, size_t size, int shmflg)
4. 函数传入值
key:
0(IPC_PRIVATE):会建立新共享内存对象
大于0的32位整数:视参数shmflg来确定操作。通常要求此值来源于ftok返回的IPC键值
size:
大于0的整数:新建的共享内存大小,以字节为单位
0:只获取共享内存时指定为0
shmflg
0:取共享内存标识符,若不存在则函数会报错
IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;
如果存在这样的共享内存,返回此共享内存的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值 与key相等的共享内存,则新建一个共享内存;
如果存在这样的共享内存则报错
5. 函数返回值
成功:返回共享内存的标识符
出错:-1,错误原因存于error中
6. 附加说明
上述shmflg参数为模式标志参数,使用时需要与IPC对象存取权限(如0600)进行|运算来确定信号量集的存取权限
错误代码
EINVAL:参数size小于SHMMIN或大于SHMMAX
EEXIST:预建立key所指的共享内存,但已经存在
EIDRM:参数key所指的共享内存已经删除
ENOSPC:超过了系统允许建立的共享内存的最大值(SHMALL)
ENOENT:参数key所指的共享内存不存在,而参数shmflg未设IPC_CREAT位
EACCES:没有权限
ENOMEM:核心内存不足
二、报EEXIST错误的处理
1. 添加错误输出代码
...
#include <string.h>
#include <errno.h>
....
shm_id = shmget(key, ....);
if (shm_id == -1) {
...
printf("%d, %s\n", errno strerror(errno));
}
2. 解决
把key转换成十六进制;
用命令查看key对应的共享内存分配信息
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x74010389 1015808 root 600 4 0
0x7401035f 1703937 root 600 4 0
0x7401035e 1671171 root 600 4 0
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages
0x000004d2 131072 root 666 40960 10
找到key对应的值,然后删除。
$ipcrm -m key对应的shmid;
1. 所需头文件
#include <sys/ipc.h>
#include <sys/shm.h>
2. 函数说明
得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符
3. 函数原型
int shmget(key_t key, size_t size, int shmflg)
4. 函数传入值
key:
0(IPC_PRIVATE):会建立新共享内存对象
大于0的32位整数:视参数shmflg来确定操作。通常要求此值来源于ftok返回的IPC键值
size:
大于0的整数:新建的共享内存大小,以字节为单位
0:只获取共享内存时指定为0
shmflg
0:取共享内存标识符,若不存在则函数会报错
IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;
如果存在这样的共享内存,返回此共享内存的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值 与key相等的共享内存,则新建一个共享内存;
如果存在这样的共享内存则报错
5. 函数返回值
成功:返回共享内存的标识符
出错:-1,错误原因存于error中
6. 附加说明
上述shmflg参数为模式标志参数,使用时需要与IPC对象存取权限(如0600)进行|运算来确定信号量集的存取权限
错误代码
EINVAL:参数size小于SHMMIN或大于SHMMAX
EEXIST:预建立key所指的共享内存,但已经存在
EIDRM:参数key所指的共享内存已经删除
ENOSPC:超过了系统允许建立的共享内存的最大值(SHMALL)
ENOENT:参数key所指的共享内存不存在,而参数shmflg未设IPC_CREAT位
EACCES:没有权限
ENOMEM:核心内存不足
二、报EEXIST错误的处理
1. 添加错误输出代码
...
#include <string.h>
#include <errno.h>
....
shm_id = shmget(key, ....);
if (shm_id == -1) {
...
printf("%d, %s\n", errno strerror(errno));
}
2. 解决
把key转换成十六进制;
用命令查看key对应的共享内存分配信息
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x74010389 1015808 root 600 4 0
0x7401035f 1703937 root 600 4 0
0x7401035e 1671171 root 600 4 0
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages
0x000004d2 131072 root 666 40960 10
找到key对应的值,然后删除。
$ipcrm -m key对应的shmid;
0 0
- shmget报EEXIST错误
- npm运行报错Error: EEXIST: file already exists解决办法
- shmget报错Invalid argument
- shmget出现Invalid argument错误
- zsim shmget出现shmget:Invalid argument错误的解决办法
- shmget
- shmget
- GNU Radio内存错误shmget (0)解决办法
- Invalid argument: could not call shmget错误处理方法
- shmget EINVAL
- shmget() ,shmat()
- linux shmget
- shmget创建共享内存errno=22,Invalid argument错误问题
- ubuntu 环境共享内存函数shmget与shmat的使用以及shmid:: Invalid argument错误的原因
- ubuntu 环境共享内存函数shmget与shmat的使用以及shmid:: Invalid argument错误的原因
- jsp报的错误
- Ant 报编码错误
- tomcat 报400错误
- 2-14-1(1) 小玩文件
- 基于TCP的最简单的通信
- 给iOS工程增加Daily Build
- setBackgroundDrawable和setBackgroundColor的用法
- MediaStore.Images.Thumbnails
- shmget报EEXIST错误
- 第三部分 高级套接字编程 ipv4与ipv6的互操作性, 守护进程编写出错,暂时未解决。
- HDOJ 3966 Aragorn's Story
- Hadoop之——Java操作HBase
- Wps 2013 拼音标注两种方式分析
- 背景图延迟加载(lazyload)技术
- Android ActionBar的使用
- 新得
- Android开发之Toast