2017-05-17 20 views
8

Używam semafora do synchronizowania niektórych części w mojej aplikacji.sem_release(): nie udało się zwolnić klucza 0xc: niepoprawny argument

Na zwalnianie semafora (sem_release) Jestem coraz to ostrzeżenie:

sem_release(): nie można zwolnić klawisz 0xC: Invalid argument

Po pierwsze nie wiem, czy semafor został wydany, ale ponieważ nie uzyskuję "prawdziwości" w wyniku, wydaje mi się, że nie jest on wypuszczany.

PHP Wersja: 06/05/30

ipcs -V => ipcs z util-Linux 2.25.2

Oto semafora:

key  semid  owner  perms  nsems 
0x0000000c 4124122 myUser  666  3 

Tutaj część kodu (klasa synchronizacji):

... 
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 Otrzymuję ten błąd tylko w moim środowisku produktywnym i nie mogę odtworzyć/debugować w moim środowisku testowym.

Wyszukiwanie w Internecie dla tego komunikatu o błędzie, ale nic nie znalazłem.

Czy ktoś wie, co oznacza ta wiadomość?

Zmieniano:

  1. komunikat Błąd nie pojawia się za każdym razem, gdy skrypt jest uruchomiony.
  2. Rzeczywiście czasami pojawia się błąd "Błąd przy pozyskiwaniu semafora" z podobnym ostrzeżeniem "sem_acquire(): nie udało się uzyskać klucza 0xc: Identyfikator usunięty", ALE nie w tym samym czasie (dzień) Otrzymuję komunikat "Błąd zwalniający semafor"
  3. Powyższa klasa jest używana w różnych miejscach z różnymi kluczami do synchronizacji części kodu aplikacji. Nie mam żadnych problemów z innymi kluczami. I tak, ten klucz "12"/"0xc" jest używany TYLKO w jednym miejscu i od tego samego użytkownika.
  4. Problemy z pozwoleniem nie powinno wystąpić maksymalnie, bo jeśli sprawdzeniu permisson semafora „0xC” jest „666”

Odpowiedz

1

mógłbyś wykonać kroki od początku:

  • uzyskanie semafora resource sem_get (int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]])
  • Pozyskanie semafor bool sem_acquire (resource $sem_identifier [, bool $nowait = false ])

i dodać poczytalności sprawdza, czy th przy powyższej funkcji zwracają oczekiwaną wartość.

Można również sprawdzić, czy druga część aplikacji działa pod tym samym użytkownikiem, aby uniknąć problemów z uprawnieniami.

+0

Edytowałem pytanie z częściami mojego kodu i informacjami, które w jakiś sposób odpowiadają na "pytania" – dritan

+0

Czy to możliwe, że twój program tworzy zakleszczenia, a następnie nie jesteś w stanie ich zwolnić? –

+0

Nie, nie sądzę, bo jeśli zdarzy się impas, to zobaczę zablokowane procesy na liście procesów. – dritan