C semop调用中EIDRM和EINVAL errno之间的差异
我使用sysv信号量测试了一些代码从各种事件中恢复的能力,对于其中一个测试,我在进程处于关键部分时删除了信号量集(从终端)。当再次调用C semop调用中EIDRM和EINVAL errno之间的差异,c,linux,sysv-ipc,C,Linux,Sysv Ipc,我使用sysv信号量测试了一些代码从各种事件中恢复的能力,对于其中一个测试,我在进程处于关键部分时删除了信号量集(从终端)。当再次调用semop释放锁时,它返回了一个错误代码,errno设置为EIDRM 根据semop手册页,以下是对每个errno含义的描述: EIDRM:已删除信号量集 EINVAL:信号量集不存在,或者semid小于零,或者nsops具有非正值 我想了解的是不存在的信号量集和已删除的信号量集之间的区别。我原以为区别在于,如果在系统调用之前删除了信号量集,errno将被设置为E
semop
释放锁时,它返回了一个错误代码,errno
设置为EIDRM
根据semop手册页,以下是对每个errno
含义的描述:
EIDRM:已删除信号量集
EINVAL:信号量集不存在,或者semid小于零,或者nsops具有非正值
我想了解的是不存在的信号量集和已删除的信号量集之间的区别。我原以为区别在于,如果在系统调用之前删除了信号量集,
errno
将被设置为EINVAL
,如果信号量集在系统调用开始时就存在并且在完成之前被删除,EIDRM
(例如,当进程通过系统调用在信号量上被阻止时,信号量集被删除).第二个错误可能是在使用路径打开信号量时出现的,第一个错误是在使用时被删除,并通过打开的信号量引用。在许多操作系统中,这方面的大部分代码都是开源的!工作只有几种风格,断开的有无限的风格!区别在于:
-ID值一度有效,但由于信号量集已被删除,因此不再有效EIDRM
-ID值现在无效,并且不是以前删除的有效IDEINVAL
如果您的ID值在上次重新启动前有效,但在上次重新启动后未重新创建,则很可能会得到
EINVAL
而不是EIDRM
。如果机器未重新启动,则可能会记住删除的ID值的持续时间短于上次重新启动时间重新启动几个月后,一个具有特定ID值的信号量集在几周前被删除,那么在尝试重用旧ID值时,您可能会得到EIDRM
或EINVAL
。System V信号量不是通过路径打开的。您可以将路径输入到ftok
中,以获取要传递到semget
返回的密钥传递到semop
对信号量进行操作的id。但是semop
本身只是将该id作为参数。