我使用Sys V信号量测试了一些代码,以了解其从各种事件中恢复的能力,对于一个这样的测试,在进程处于关键部分时,我删除了信号量集(从终端)。当再次调用semop释放锁时,它返回一个错误代码,其中errno设置为EIDRM。
根据semop的手册,下面是对每个errno的含义的描述:
EIDRM:信号量集被删除。
EINVAL:信号量集不存在,或者半is小于零,或者nsops具有非正值。
我想要理解的是不存在的信号量集和被删除的信号量集之间的区别。我曾认为不同之处在于,如果在系统调用之前删除了信号量集,则将errno设置为EINVAL;如果信号量集在系统调用开始时就存在,并在完成之前被移除,则设置为EIDRM (例如,当进程通过系统调用在信号量上被阻塞时,将删除信号量集)。
发布于 2020-09-01 01:41:39
区别是:
EIDRM --有一次,ID值是有效的,但是它不再有效,因为信号量集已经是removed.EINVAL --该ID值现在无效,并且不是以前被删除的有效ID。如果您的ID值在上次重新启动之前是有效的,但在上次重新启动后没有重新创建,那么很可能会得到EINVAL而不是EIDRM。记住所删除的ID值的持续时间可能比上次重新启动时间短--也就是说,如果几个月前没有重新启动机器,并且几周前删除了带有特定ID值的信号量集,那么在尝试重用该旧ID值时可能会得到EIDRM或EINVAL。
发布于 2020-08-20 18:09:23
第二个错误可能是当您使用路径打开信号量时,第一个错误是在使用时删除它,通过打开的信号量引用它。在许多操作系统中,大部分代码都是开源的!工作带来了几种味道,破碎带来了无穷的味道!
https://stackoverflow.com/questions/63508204
复制相似问题