Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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/4/webpack/2.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
如何从php进程解释Linux系统上的信号量值?_Php_Linux_Semaphore - Fatal编程技术网

如何从php进程解释Linux系统上的信号量值?

如何从php进程解释Linux系统上的信号量值?,php,linux,semaphore,Php,Linux,Semaphore,我的问题的基础基本上是,它在2.6.30-gentoo-r4Linux系统上对信号量执行操作。为了研究在中使用信号量的问题,我查看了由semid=0和semnum=0定义的信号量的值semval、semzcnt、semncnt和sempid(请参阅)。这四个值由一个小型C程序检查,并在其中一个值发生变化时写入屏幕。以下是一个示例输出,包括时间戳: Status at 1415851183.974700: semval=0 semzcnt=0 semncnt=0 sempid=1244 S

我的问题的基础基本上是,它在
2.6.30-gentoo-r4
Linux系统上对信号量执行操作。为了研究在中使用信号量的问题,我查看了由
semid=0
semnum=0
定义的信号量的值
semval
semzcnt
semncnt
sempid
(请参阅)。这四个值由一个小型C程序检查,并在其中一个值发生变化时写入屏幕。以下是一个示例输出,包括时间戳:

Status at 1415851183.974700:  semval=0  semzcnt=0  semncnt=0  sempid=1244
Status at 1415851183.977678:  semval=1  semzcnt=0  semncnt=0  sempid=1244
Status at 1415851184.630576:  semval=0  semzcnt=0  semncnt=0  sempid=1207
Status at 1415851184.721588:  semval=1  semzcnt=0  semncnt=0  sempid=1207
我的解释是,第一行表示进程1244从信号量获取了唯一可用的资源,并在3毫秒后返回。大约一秒钟后,另一个PID为1207的进程获取了资源(将信号量值从1减为零),并在大约100毫秒后返回

但是,我也看到了以下输出:

Status at 1415851188.925930:  semval=0  semzcnt=0  semncnt=0  sempid=4869
Status at 1415851188.928922:  semval=1  semzcnt=0  semncnt=0  sempid=4869
Status at 1415851188.965917:  semval=0  semzcnt=0  semncnt=0  sempid=4173
Status at 1415851189.046912:  semval=0  semzcnt=0  semncnt=1  sempid=4173
Status at 1415851189.237873:  semval=0  semzcnt=0  semncnt=2  sempid=4173
Status at 1415851189.249882:  semval=0  semzcnt=0  semncnt=3  sempid=4173
Status at 1415851189.275878:  semval=0  semzcnt=0  semncnt=4  sempid=4173
Status at 1415851189.311886:  semval=0  semzcnt=0  semncnt=5  sempid=4173
这里,PID 4173的进程似乎正在使用资源(
semval
递减为零),但没有返回资源。之后,需要相同的资源(看起来是由相同的进程提供的),但由于第一个资源尚未返回,信号量会被阻塞

这里的问题是针对semid的文档说明:

这不可能是真的,也不是真的!因为我对PHP代码中的信号量操作(不同的PHP进程使用相同的函数)进行了并行记录,所以我看到那些
semop
作用于具有不同
pid
的不同进程。我认为
semop
的文档不太正确,因为
sempid
似乎表明了上一次成功的op的过程PID,或者类似的东西

然而,我的解释是否正确,进程4173以某种方式阻塞了资源/信号量,因此所有希望获取资源的其他进程都被阻塞了?此外,通过调试
php
code,我看到
sem_acquire
(大约在时间1415851188.965917左右)从未返回到
php
解释器,因此阻止了进程4173。但是,正如我们所看到的,进程4173成功地将
semval
减少了一到零,一切都应该正常。也许这是php中的一个bug

pid_t           sempid;   /* ID of process that did last op */