2013-07-28 6 views
7

Mam taki kod i chcę zrozumieć, jak działa fork, ale jestem zdezorientowany z declare(ticks=1). kiedy umieściłem go w pierwszym wierszu, po zakończeniu procesu potomnego, program obsługi sygnału zostanie wywołany, a tego właśnie chcę; ale kiedy go usuniemy, obsługa sygnału nigdy nie zostanie wywołana! Tak więc chcę wiedzieć, w jaki sposób kleszcze wpływają na przetwarzanie sygnału.Jaka jest relacja między deklarowaniem (tyk) i obsługą sygnału w php

<?php 
declare(ticks=1); 
function sigHandler($signal) 
{ 
    echo "a child exited\n"; 
} 
pcntl_signal(SIGCHLD, sigHandler, false); 
echo "this is " . posix_getpid() . PHP_EOL; 
for($i=0; $i<3; $i++) 
{ 
    $pid = pcntl_fork(); 
    if($pid == -1) 
    { 
     echo 'fork failed ' . PHP_EOL; 
    } 
    else if($pid) 
    { 
    } 
    else 
    { 
     $pid = posix_getpid(); 
     echo 'child ' . $pid . ' ' . time() . PHP_EOL; 
     sleep(rand(2,5)); 
     echo 'child ' . $pid . ' done ' . time() . PHP_EOL; 
     exit(0); 
    } 
} 
do 
{ 
    $pid = pcntl_wait($status); 
    echo 'child quit ' . $pid . PHP_EOL; 
}while($pid > 0); 
echo 'parent done' . PHP_EOL; 
?> 

Odpowiedz

9

Minor obserwacji (z podaniem nazwy funkcji pls.):

pcntl_signal(SIGCHLD, 'sigHandler', false); 

Istnieją dwa różne interfejsy API zaangażowane.

  • Połączenie pcntl_wait() jest blokowane, dopóki nie otrzyma powiadomienia z jądra.
  • Obsługa przerwań jest pętlą zdarzeń wewnątrz interpretera PHP. To jest funkcja hackowania, a od PHP5.3 jest lepszy sposób na zrobienie tego ~ pcntl_signal_dispatch().
    • Aby odpowiedzieć na pytanie, mając declare kleszcze jest jak toczenie swój telefon dzwonek na, lub w inny sposób nie można zauważyć połączeń przychodzących.
    • Metoda PHP5.3 to dużo lepsza technika i dużo łatwiejsza do kontrolowania.
    • Domyślnym handsetem sygnału dla większości sygnałów jest sigignore, który odbiera przerwanie i nic nie robi. Ponieważ zarejestrowałeś użytkownika obsługi, wątpię, aby był on używany.
    • Nigdy nie udało mi się odkryć domyślnej wartości tyknięć, jeśli nie ustawiono jej bezpośrednio.
    • Ustawienie tyknięć na małą wartość powoduje, że skrypty zaczynają działać wolniej, ale aby to zauważyć, należy wykonywać intensywne przetwarzanie i monitorowanie. Jest to mniej przewidywalny koszt wykonania, chyba ze względu na kopiowanie rzeczy w stosie.
    • Bez zadeklarować ticks lub pcntl_signal_dispatch(), sygnał nigdy nie zostanie odebrany. Jeśli piszesz proste strony internetowe, które szybko się kończą; może to być najrozsądniejsza polityka.
    • zadeklarować ticks należy dokładnie przetestować, ponieważ ma mylące reguły dotyczące zakresu. Najbezpieczniejsza metoda umieszczenia go na czele pierwszego skryptu, np. , wymaga ścisłej w języku Perl.
+0

dziękuję za odpowiedź – zhaozhi

Powiązane problemy