如何从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 */