sem_release():无法释放密钥0xc:无效的参数

时间:2017-05-17 13:17:09

标签: php semaphore ipcs

我使用信号量来同步应用程序中的某些部分。

在发布信号量(sem_release)时,我收到此警告:

  

sem_release():无法释放键0xc:无效参数

首先,我不知道信号量是否已经释放,但是因为我没有得到#34; true"结果,我猜它没有发布。

PHP版本:5.6.30

ipcs -V => ipcs来自util-linux 2.25.2

这是信号量:

key        semid      owner      perms      nsems 
0x0000000c 4124122    myUser      666        3

以下是代码的一部分(类同步):

...
if ( !( $this->semaphoreId = sem_get( $this->id, 1 ) ) )
    throw new RuntimeException( 'Error getting Semaphore.');
...

if ( !sem_acquire( $this->semaphoreId ) )
   throw new RuntimeException( 'Error acquiring Semaphore.');
...
if ( !sem_release( $this->semaphoreId ) )
    throw new RuntimeException( 'Error releasing Semaphore.');

P.S。我只在我的生产环境中收到此错误,而且我无法在我的测试环境中重现/调试。

我在互联网上搜索了这条错误消息,但我什么也没找到。

有谁知道这条消息的含义?

编辑:

  1. 每次脚本运行时都不会显示错误消息。
  2. 我确实有时会收到错误'错误获取信号量'使用类似的警告' sem_acquire():无法获取密钥0xc:标识符被删除',但不是在同一时间(天)我得到了发布信号量的错误'
  3. 上面的类在不同的地方使用,以同步部分应用程序代码。我对其他密钥没有任何问题。是的,这个关键" 12" /" 0xc"只在一个地方和同一个用户使用。
  4. 不应该出现权限问题,因为如果你检查信号量的权限" 0xc"是" 666"

1 个答案:

答案 0 :(得分:1)

您能否从头开始执行以下步骤:

  • 获取信号量dict["a"] = 2
  • 获取信号量resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )

并添加完整性检查以确保上述函数返回预期值。

您是否还可以检查应用程序的其他部分是否在同一用户下运行以避免权限问题。