共享内存shmget的郁闷

今天上午试验共享内存 shmget,但是总是不能成功申请到内存。

一开始还以为是第一个参数key有问题,调试了半天,发现key是正确的,没有报错,也可以根据不同路径变化。

key_t ftok(const char *pathname, int proj_id);
注意:
1)pathname一定要在系统中存在
2)pathname一定是使用进程能够访问的
3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。
参考的是这个生成的key。

而对于shmget的第三个参数,总是找不到详细的介绍。

出现的情况如下:

1.shmID=shmget(key,1024,IPC_CREAT);

这种形式是某些网上出现的,不会报错,但是发现申请的地址都是k=0xffffffff,不能使用,否则会出现Segmentation fault。使用ipcs无法查到申请到的共享内存段。但是,当你使用这种形式调用以后,这个key就不能再放到下面的第二种形式里面去用了,系统会报File exists。晕,ipcs里面没有,但是实际建了一个File了。不知道这样会不会造成内存泄漏,因为我不能用ipcrm删掉这个File。

这种形式还是有点作用,就是当你使用下面的形式成功申请以后,可以用这种形式使用该共享内存段。资料上说,第二次使用的时候size应该为0,但是我发现不是0也可以用。不过,这里的成功是指已经成功分配共享内存,就是说在ipcs里面可以看到有分配内存的时候。不过如果ipcs里面没有分配内存,会报File exists,这样就要指定参数为0了,才能正确运行。

2.shmID=shmget(key,1024,0666|IPC_CREAT|IPC_EXCL);

这种形式也是网上有的,可以查到IPC_CREAT|IPC_EXCL的含义,但是“0666”的作用还不清楚。《UNIX环境高级编程》上说这些是填充到shmid_ds这个结构体的ipc_perm中的mode。

这种形式,是可以成功申请到内存的。但是必须是新建的共享内存段,否则会出现File exists。

3.shmID=shmget(key,1024,0666|IPC_CREAT);

这种形式是我在想第一种形式为什么不能申请成功的时候写的。结果居然出现的是Permission denied,也是失败。但是当组合IPC_EXCL时就不会出现。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值