首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从semop调用看EIDRM和EINVAL errno的区别

从semop调用看EIDRM和EINVAL errno的区别
EN

Stack Overflow用户
提问于 2020-08-20 15:18:09
回答 2查看 309关注 0票数 2

我使用Sys V信号量测试了一些代码,以了解其从各种事件中恢复的能力,对于一个这样的测试,在进程处于关键部分时,我删除了信号量集(从终端)。当再次调用semop释放锁时,它返回一个错误代码,其中errno设置为EIDRM

根据semop的手册,下面是对每个errno的含义的描述:

EIDRM:信号量集被删除。

EINVAL:信号量集不存在,或者半is小于零,或者nsops具有非正值。

我想要理解的是不存在的信号量集和被删除的信号量集之间的区别。我曾认为不同之处在于,如果在系统调用之前删除了信号量集,则将errno设置为EINVAL;如果信号量集在系统调用开始时就存在,并在完成之前被移除,则设置为EIDRM (例如,当进程通过系统调用在信号量上被阻塞时,将删除信号量集)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-01 01:41:39

区别是:

  • EIDRM --有一次,ID值是有效的,但是它不再有效,因为信号量集已经是removed.
  • EINVAL --该ID值现在无效,并且不是以前被删除的有效ID。

如果您的ID值在上次重新启动之前是有效的,但在上次重新启动后没有重新创建,那么很可能会得到EINVAL而不是EIDRM。记住所删除的ID值的持续时间可能比上次重新启动时间短--也就是说,如果几个月前没有重新启动机器,并且几周前删除了带有特定ID值的信号量集,那么在尝试重用该旧ID值时可能会得到EIDRMEINVAL

票数 1
EN

Stack Overflow用户

发布于 2020-08-20 18:09:23

第二个错误可能是当您使用路径打开信号量时,第一个错误是在使用时删除它,通过打开的信号量引用它。在许多操作系统中,大部分代码都是开源的!工作带来了几种味道,破碎带来了无穷的味道!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63508204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档