注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

NET START HERE

研究C/C++、网络/通信/协议编程、网络安全、软件安全

 
 
 

日志

 
 

linux 创建信号量失败(create semaphore error -1)原因分析  

2011-08-03 10:04:13|  分类: 技术探讨 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在使用linux创建信号量时,初学者往往会遇到创建失败的问题,而代码又是照着书上原样打上去的却失败,很让人纠结,下面就几个原因来进行总结一下失败原因

1、调用创建信号量函数时信号量个数为0

如:semid = semget(key,0,IPC_CREAT|0666);

semget函数第二个参数表示需要创建的信号量个数,如果写为0,创建肯定会失败,在linux网络编程一书中就是将这个变量误写为了0,导致初学者一时摸不到头脑

2、在semget函数调用时设置权限标志错误,可参照一下semget函数详解

系统调用:semget();
原型:intsemget(key_t key,int nsems,int semflg);
返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1:errno=EACCESS(没有权限)
EEXIST(信号量集已经存在,无法创建)
EIDRM(信号量集已经删除)
ENOENT(信号量集不存在,同时没有使用IPC_CREAT)
ENOMEM(没有足够的内存创建新的信号量集)
ENOSPC(超出限制)
系统调用semget()的第一个参数是关键字值(一般是由系统调用ftok()返回的)。系统内核将此值和系统中存在的其他的信号量集的关键字值进行比 较。打开和存取操作与参数semflg中的内容相关。IPC_CREAT如果信号量集在系统内核中不存在,则创建信号量集。IPC_EXCL当和 IPC_CREAT一同使用时,如果信号量集已经存在,则调用失败。如果单独使用IPC_CREAT,则semget()要么返回新创建的信号量集的标识 符,要么返回系统中已经存在的同样的关键字值的信号量的标识符。如果IPC_EXCL和IPC_CREAT一同使用,则要么返回新创建的信号量集的标识 符,要么返回-1。IPC_EXCL单独使用没有意义。参数nsems指出了一个新的信号量集中应该创建的信号量的个数。


3、这个不属于创建错误问题,是一个常见的问题,如何在两个不同进程中使用同一个信号量?

我们都知道,在创建信号量时有一个参数,key,它就是用于取得一个存在的信号量的唯一标识, 通常情况下,该id值通过ftok函数得到, 在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
查询文件索引节点号的方法是: ls -i

所以要取得同一信号量,要么确保key_t值不变,要么确保ftok调用的文件不被删除,要么不用ftok,即指定一个固定的key_t值,比如:

#define IPCKEY 0x10005600

但这种方法也有缺点,因为没有办法保证这个IPCKEY是唯一的,因此取一个较大的数以减少key出现冲突的机会




 
  评论这张
 
阅读(1940)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017