我正在使用Sys V信号量测试某些代码的功能,以使其能够从各种事件中恢复,对于这样的测试,我在过程处于关键部分时(从终端)删除了信号量集。当需要再次调用semop
来释放锁时,它返回了一个错误代码,且errno
设置为EIDRM
。
根据semop的联机帮助页,以下是每个errno
含义的描述:
我想了解的是不存在的信号量集与已删除的信号量集之间的区别。我以为区别在于,如果在系统调用之前删除了信号量集,则errno
将设置为EINVAL
;如果在系统调用开始时已存在信号量集,并且在完成之前将其删除,则EIDRM
将设置为ojit_code(例如(通过系统调用在信号量上阻止该进程的同时删除信号量集)。
最佳答案
区别在于:
EIDRM
—一次,该ID值是有效的,但是由于删除了信号量集,该ID值不再有效。 EINVAL
— ID值现在无效,并且不是先前已删除的有效ID。 如果您的ID值在上次重新引导之前有效,但自上次重新引导以来未重新创建,则很有可能会得到
EINVAL
而不是EIDRM
。记住删除的ID值的持续时间可能比上次重新启动时间短-也就是说,如果机器几个月未重新启动,并且几周前删除了具有特定ID值的信号灯集,则您可能尝试重用该旧ID值时,请获取EIDRM
或EINVAL
。关于c - semop调用中EIDRM和EINVAL errno之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63508204/