来自 semop 调用的 EIDRM 和 EINVAL errno 之间的区别

Difference between EIDRM and EINVAL errno from semop call

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

根据 semop 的联机帮助页,这些是每个 errno 含义的描述:

EIDRM: The semaphore set was removed.

EINVAL: The semaphore set doesn't exist, or semid is less than zero, or nsops has a nonpositive value.

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

可能第二个错误是打开带有路径的信号量,第一个是使用时删除,通过打开的信号量引用。许多 OS 中的大部分代码都是开源的!干活有几种,坏掉有无穷种!

区别是:

  • EIDRM — ID 值曾经有效,但由于信号量集已被删除而不再有效。
  • EINVAL — ID 值现在无效并且不是以前有效的 ID,已被删除。

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