来自 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 值时得到 EIDRM
或 EINVAL
。
我正在使用 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 值时得到 EIDRM
或 EINVAL
。