Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C semop调用中EIDRM和EINVAL errno之间的差异_C_Linux_Sysv Ipc - Fatal编程技术网

C semop调用中EIDRM和EINVAL errno之间的差异

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

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

根据semop手册页,以下是对每个
errno
含义的描述:

EIDRM:已删除信号量集

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


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

第二个错误可能是在使用路径打开信号量时出现的,第一个错误是在使用时被删除,并通过打开的信号量引用。在许多操作系统中,这方面的大部分代码都是开源的!工作只有几种风格,断开的有无限的风格!

区别在于:

  • EIDRM
    -ID值一度有效,但由于信号量集已被删除,因此不再有效
  • EINVAL
    -ID值现在无效,并且不是以前删除的有效ID

如果您的ID值在上次重新启动前有效,但在上次重新启动后未重新创建,则很可能会得到
EINVAL
而不是
EIDRM
。如果机器未重新启动,则可能会记住删除的ID值的持续时间短于上次重新启动时间重新启动几个月后,一个具有特定ID值的信号量集在几周前被删除,那么在尝试重用旧ID值时,您可能会得到
EIDRM
EINVAL

System V信号量不是通过路径打开的。您可以将路径输入到
ftok
中,以获取要传递到
semget
返回的密钥传递到
semop
对信号量进行操作的id。但是
semop
本身只是将该id作为参数。