shmget创建共享内存errno=22,Invalid argument错误问题
来源:互联网 发布:学编程能做什么工作 编辑:程序博客网 时间:2024/05/20 18:52
今天编写的程序,要使用一个共享内存,共享内存是由别的进程创建并初始化,我这边负责将内存attach 到我的进程空间里,在调用函数 shmget 的时候报错了
errno = 22 Invalid argument
然后就是查找问题,花了大半天都没找到问题,最后重启机器好了,经过我的思考与查找,我认为有2个原因导致的。
1. 程序编译的时候,打开的共享内存必须先关闭,也就是说在编译带有共享内存程序的时候,必须先在终端使用命令ipcrm 掉使用的share memery,因为创建共享内存的程序已经在运行,我的程序必须要attch这块共享内存,因此编译出来,可能导致错误。
2. 共享内存的结构被修改,也就是说创建的共享内存结构和你将要attch 之后的共享内存结构不一致导致的,创建共享内存程序的大小,比我的程序要使用的共享内存要小,虽然shmid都是一样,但是大小比创建的大,这肯定是有问题,因为我的程序结构比创建程序使用的结构要多2个结构体,因此这个会导致程序无效的参数。
今天编写的程序,要使用一个共享内存,共享内存是由别的进程创建并初始化,我这边负责将内存attach 到我的进程空间里,在调用函数 shmget 的时候报错了int shmid = shmget((key_t)key,size,0);if(shmid == -1 ){ perror("shmget error:"); return NULL;}else{ return shmat(shmid,0,0);}
然后就是查找问题,花了大半天都没找到问题,最后重启机器好了,经过我的思考与查找,我认为有2个原因导致的。
1. 程序编译的时候,打开的共享内存必须先关闭,也就是说在编译带有共享内存程序的时候,必须先在终端使用命令ipcrm 掉使用的share memery,因为创建共享内存的程序已经在运行,我的程序必须要attch这块共享内存,因此编译出来,可能导致错误。
2. 共享内存的结构被修改,也就是说创建的共享内存结构和你将要attch 之后的共享内存结构不一致导致的,创建共享内存程序的大小,比我的程序要使用的共享内存要小,虽然shmid都是一样,但是大小比创建的大,这肯定是有问题,因为我的程序结构比创建程序使用的结构要多2个结构体,因此这个会导致程序无效的参数。
写这两点,为铭记我查找半天代码的代价,传到博客,供大家共享,以避免重走我的老路,为无谓的错误浪费大量时间。
具体的用法总结如下:
1、显示所有的IPC设施
# ipcs -a
2、显示所有的消息队列Message Queue
# ipcs -q
3、显示所有的信号量
# ipcs -s
4、显示所有的共享内存
# ipcs -m
5、显示IPC设施的详细信息
# ipcs -q -i id
id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。
6、显示IPC设施的限制大小
# ipcs -m -l
-m对应设施类型,可选参数包括-q、-m、-s。
7、显示IPC设施的权限关系
# ipcs -c
# ipcs -m -c
# ipcs -q -c
# ipcs -s -c
8、显示最近访问过IPC设施的进程ID。
# ipcs -p
# ipcs -m -p
# ipcs -q -p
9、显示IPC设施的最后操作时间
# ipcs -t
# ipcs -q -t
# ipcs -m -t
# ipcs -s -t
10、显示IPC设施的当前状态
# ipcs -u
Linux上的ipcs命令,不支持UNIX上的-b、-o指令,同样UNIX中不支持-l、-u指令,所以在编写跨平台的脚本时,需要注意这个问题。
[root@localhost ~]# ipcs -a------ Message Queues --------key msqid owner perms used-bytes messages ------ Shared Memory Segments --------key shmid owner perms bytes nattch status 0x00000000 196608 root 600 524288 2 dest 0x00000000 229377 root 600 4194304 2 dest 0x00000000 327682 root 600 4194304 2 dest 0x6f000af7 622595 root 666 204000 0 0x00000000 458756 root 600 393216 2 dest 0x51006ce5 491525 root 600 1024 1 0x00000000 524294 root 600 5674396 2 dest 0x00000000 557063 root 600 4194304 2 dest ------ Semaphore Arrays --------key semid owner perms nsems 0x510014fb 65536 root 600 1 0x0b000af7 98305 root 666 1 [root@localhost ~]# ipcrm -m 622595
阅读全文
0 0
- shmget创建共享内存errno=22,Invalid argument错误问题
- shmget出现Invalid argument错误
- ubuntu 环境共享内存函数shmget与shmat的使用以及shmid:: Invalid argument错误的原因
- ubuntu 环境共享内存函数shmget与shmat的使用以及shmid:: Invalid argument错误的原因
- zsim shmget出现shmget:Invalid argument错误的解决办法
- setsockopt invalid argument,errno 22
- OSError: [Errno 22] Invalid argument:
- 共享内存:shmat:invalid argument
- Invalid argument: could not call shmget错误处理方法
- shmget 返回 -1, Invalid argument
- shmget报错Invalid argument
- /*创建共享内存*/ shmid=shmget(IPC_PRIVATE,1024,PERM);
- 手动删除shmget创建的共享内存
- shmget() -- 建立共享内存
- shmget() -- 建立共享内存
- shmget() -- 建立共享内存
- shmget() -- 建立共享内存
- shmget 共享内存
- HTTP请求方式小结
- AngularJs轻松入门源码托管至Github
- RestTemplate的两种请求GET和POST.不含摘要和基本认证
- Linux下的Makefile文件编写
- Linux 中查看文件第n行内容的命令
- shmget创建共享内存errno=22,Invalid argument错误问题
- ubuntu安装caffe
- Maven错误:'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing
- QT读入MySQL数据库报 “QSqlQuery::exec:database not open”
- delegate有两个事件时的返回值
- 数字和为sum的方法数
- Ceres(5): Solver
- theano T.dot 实例 (是tf.matmul而不是点乘)
- (BFS)Knight Moves--HDOJ