gpt4 book ai didi

c - semop 调用中 EIDRM 和 EINVAL errno 之间的区别

转载 作者:行者123 更新时间:2023-12-03 10:00:21 25 4
gpt4 key购买 nike

我正在使用 Sys V Semaphores 测试一些代码,以了解其从各种事件中恢复的能力,对于其中一项测试,我在进程处于其关键部分时删除了信号量集(从终端)。当需要再次调用 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如果信号量集在系统调用开始时已经存在并在完成之前被删除(例如,当进程通过系统调用在信号量上阻塞时,信号量集被删除)。

最佳答案

区别在于:

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

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

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com