2009-07-28 9 views
6

Jeśli powiem Perl jawnie ignorować sygnał SIGINT nie ma wpływu:Jaka jest różnica między ignorowaniem sygnału i mówieniem mu, aby nie robił nic w Perlu?

$SIG{INT} = 'IGNORE'; 
my $count = 0; 
say $count++ and sleep 1 while 1; 

następnie naciskając klawisz Control-C, a oczywiście, nie ma wpływu. Jeśli, z drugiej strony, mówię, żeby nic nie robił:

$SIG{INT} = sub { }; 
my $count = 0; 
say $count++ and sleep 1 while 1; 

Następnie naciśnięcie Control-C daje efekt! Budzi program z wywołania sleep() i natychmiast zwiększa liczbę. Jaka jest różnica między ignorowaniem sygnału i mówieniem mu, by nic nie robił?

W moim programie chciałbym mieć kod uruchamiany na SIGINT, bez powodujący zakłócenie czegokolwiek. Chcę coś takiego:

$SIG{INT} = sub { say "Caught SIGINT!"; return IGNORED; }; # runs without disrupting sleep 
+0

W jaki sposób Twój program obsługi sygnału może działać bez zakłócania działania aktualnie uruchomionego? Logika obsługi sygnału będzie musiała wiedzieć, co ma się stać PRZED nadejściem sygnału. – innaM

Odpowiedz

1

Nie wiem, dlaczego to nie działa zgodnie z oczekiwaniami, ale normalnie, gdy próbuję wykonać podobne rzeczy ja też pułapka sygnał TERM oprócz sygnału INT.

13

Jaka jest różnica między ignorowaniem sygnału i mówieniem mu, aby nic nie robił?

Twoja procedura "nie rób nic" jest nadal wywoływana po dostarczeniu sygnału, przerywając w tym przypadku wywołanie sleep. Z drugiej strony, ignorowane sygnały są po prostu odrzucane przez system, nie wywierając żadnego wpływu na proces.

Zobacz here dla specyficznego dla C, ale bardziej wyczerpującego odnośnika.

6

Wiele wywołań systemowych może zostać przerwanych przez dostarczenie sygnału. Zwykle można sprawdzić $! (alias errno), aby sprawdzić, czy jest to EINTR i podjąć działania, aby ponownie spróbować nieudanego wywołania systemowego.

Jeśli ważne jest, aby niektóre sekcje kodu (w tym przypadku połączenie z sleep()) nie zostały przerwane, można użyć POSIX::sigprocmask do blokowania sygnałów, gdy znajdujesz się w sekcji krytycznej. Wszelkie sygnały odbierane przez aplikację będą umieszczane w kolejce do momentu ich odblokowania, w którym to momencie będą dostarczane. Jestem prawie pewien, że istnieje pewna śmieszna semantyka, gdy wiele sygnałów określonego typu jest zablokowanych (myślę, że mogą się one łączyć w jeden sygnał).

Oto nice primer od IBM na funkcje ponownego włączenia i zawiera małą próbkę z sigprocmask.

+0

+1. Rozumiem, że większość wariantów UNIX będzie absolutnie kojarzy wiele sygnałów tego samego typu. Kiedy widzisz sygnał XYZ, możesz być pewien, że XYZ został podniesiony * przynajmniej raz *. –

Powiązane problemy