我正在使用Sys V信号量测试某些代码的功能,以使其能够从各种事件中恢复,对于这样的测试,我在过程处于关键部分时(从终端)删除了信号量集。当需要再次调用semop来释放锁时,它返回了一个错误代码,且errno设置为EIDRM
根据semop的联机帮助页,以下是每个errno含义的描述:

我想了解的是不存在的信号量集与已删除的信号量集之间的区别。我以为区别在于,如果在系统调用之前删除了信号量集,则errno将设置为EINVAL;如果在系统调用开始时已存在信号量集,并且在完成之前将其删除,则EIDRM将设置为ojit_code(例如(通过系统调用在信号量上阻止该进程的同时删除信号量集)。

最佳答案

区别在于:

  • EIDRM —一次,该ID值是有效的,但是由于删除了信号量集,该ID值不再有效。
  • EINVAL — ID值现在无效,并且不是先前已删除的有效ID。

  • 如果您的ID值在上次重新引导之前有效,但自上次重新引导以来未重新创建,则很有可能会得到EINVAL而不是EIDRM。记住删除的ID值的持续时间可能比上次重新启动时间短-也就是说,如果机器几个月未重新启动,并且几周前删除了具有特定ID值的信号灯集,则您可能尝试重用该旧ID值时,请获取EIDRMEINVAL

    关于c - semop调用中EIDRM和EINVAL errno之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63508204/

    10-09 06:15