2017-05-17 18 views
8

私はセマフォを使用してアプリケーションの一部を同期しています。sem_release():キーを解放できませんでした0xc:無効な引数

sem_release():私はこの警告を取得していセマフォ(sem_release)の開放で

は、キーから0xCを解放するために失敗しました:無効な引数

最初に私がいるかどうかわかりませんセマフォーがリリースされましたが、結果として「真実」になっていないので、リリースしていないと思います。

PHPバージョン:2.25.2

のutil-Linuxからの5.6.30

IPCS -V => IPCSここセマフォである:ここ

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.'); 

PSこのエラーは私の生産的な環境でしか得られず、私はテスト環境で再現/デバッグできません。

インターネットでこのエラーメッセージを検索しましたが、何も見つかりませんでした。

誰でもこのメッセージの意味を知っていますか?

編集:

  1. は、エラーメッセージは、スクリプトが実行されているすべての時間は表示されません。
  2. 私は「Semaphoreのエラーを取得しています」というエラーが発生しました。「sem_acquire():キーを取得できませんでした。識別子が削除されました。
  3. 上記のクラスは、アプリケーションコードの一部を同期させるために異なるキーを使用しています。私は他のキーに問題はありません。そして、はい、このキー "12"/"0xc"は、同じ場所と同じユーザーからのみ使用されます。権限の問題がoccureべきではありません
  4. 、あなたがセマフォ「から0xC」のpermissonを確認した場合は「666」

答えて

1

であるあなたが最初からの手順に従ってくださいでしたので:

  • セマフォを取得セマフォbool sem_acquire (resource $sem_identifier [, bool $nowait = false ])

と必ず目を作るために健全性チェックを追加するの獲得resource sem_get (int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]])

  • 上記の関数で期待値を返しています。

    許可の問題を回避するために、アプリケーションの他の部分が同じユーザーで実行されているかどうかを確認することもできます。

  • +0

    自分のコードの一部と質問に何らかの形で回答した質問を編集しました – dritan

    +0

    プログラムがデッドロックを作成していて、それを解放できないことがありますか? –

    +0

    いいえデッドロックが発生した場合、プロセスリストにブロックされたプロセスが表示されるので、私はそうは思わない。 – dritan

    関連する問題