2

我正在使用 Sys V Semaphores 测试一些代码,以了解其从各种事件中恢复的能力,并且对于其中一项测试,我在进程处于其关键部分时删除了信号量集(从终端)。当需要通过另一个调用来释放锁时,它返回了一个设置为semop的错误代码。errnoEIDRM

根据 semop 的手册页,这些是每个errno含义的描述:

EIDRM:信号量集已删除。

EINVAL:信号量集不存在,或者 semid 小于零,或者 nsops 具有非正值。

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

4

2 回答 2

1

区别在于:

  • EIDRM— 有一次,ID 值是有效的,但它不再有效,因为信号量集已被删除。
  • EINVAL— ID 值现在无效,并且不是之前删除的有效 ID。

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

于 2020-09-01T01:41:39.620 回答
0

可能第二个错误是因为当您打开带有路径的信号量时,第一个是如果它在使用时被删除,通过打开的信号量引用。许多操作系统中的大部分代码都是开源的!工作有几种口味,破碎有无限口味!

于 2020-08-20T18:09:23.313 回答