Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251536
  • 博文数量: 35
  • 博客积分: 198
  • 博客等级: 入伍新兵
  • 技术积分: 443
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-28 10:30
文章分类

全部博文(35)

文章存档

2015年(5)

2014年(14)

2013年(8)

2012年(7)

2011年(1)

我的朋友

分类: LINUX

2013-07-27 22:28:57

今天编写的程序,要使用一个共享内存,共享内存是由别的进程创建并初始化,我这边负责将内存attach 到我的进程空间里,在调用函数 shmget 的时候报错了

  1. int shmid = shmget((key_t)key,size,0);
  2. if(shmid == -1 )
  3. {
  4.      perror("shmget error:");
  5.      return NULL;
  6. }else
  7. {
  8.     return shmat(shmid,0,0);

  9. }
errno = 22  Invalid argument

然后就是查找问题,花了大半天都没找到问题,最后重启机器好了,经过我的思考与查找,我认为有2个原因导致的。

1. 程序编译的时候,打开的共享内存必须先关闭,也就是说在编译带有共享内存程序的时候,必须先ipcrm 掉使用的share memery,因为创建共享内存的程序已经在运行,我的程序必须要attch这块共享内存,因此编译出来,可能导致错误。
2. 共享内存的结构被修改,也就是说创建的共享内存结构和你将要attch 之后的共享内存结构不一致导致的,创建共享内存程序的大小,比我的程序要使用的共享内存要小,虽然shmid都是一样,但是大小比创建的大,这肯定是有问题,因为我的程序结构比创建程序使用的结构要多2个结构体,因此这个会导致程序无效的参数。

写这两点,为铭记我查找半天代码的代价,传到博客,供大家共享,以避免重走我的老路,为无谓的错误浪费大量时间。
阅读(16647) | 评论(1) | 转发(1) |
0

上一篇:ltrim 函数,rtrim 函数

下一篇:AS6 启动报错

给主人留下些什么吧!~~

tansijie2014-04-25 15:36:27

补充部分: 
经过测试, shmget  error Invalid argument错误 另外可能的一个问题可能是要求分配的共享内存大过了系统限制,这样也会引起这个问题,在Linux系统/etc/sysctl.conf  kernel.shmmax 参数调大即可解决这个问题。