Sygnaly.pdf

(68 KB) Pobierz
379689503 UNPDF
Obsługa
sygnałów
Tomasz Borzyszkowski
Wprowadzenie
Zaawansowane systemy operacyjne często realizując duże zadania,
wykorzystują do ich realizacji wiele współdziałających ze sobą
programów/procesów. Do dobrego współdziałania procesy te muszą
komunikować się ze sobą. W systemach Unixowych istnieje wiele
mechanizmów komunikacji międzyprocesowej. Najczęściej używane
to: sygnały , potoki i kolejki FIFO . Na bieżącym wykładzie
przyjrzymy się bliżej sygnałom.
Sygnały dostarczają prostej metody przekazywania przerwań
programowych do procesu Unixowego. Z powodu swojej natury,
sygnały są używane raczej do obsługi nietypowych sytuacji, a nie do
prostego przesyłania danych pomiędzy procesami. Proces może zrobić
z sygnałem następujące rzeczy:
Wybrać sposób reakcji po otrzymaniu sygnału (obsługa sygnału)
Blokować sygnał, tj. pozostawić go na później; dotyczy krytycznych
fragmentów kodu
Wysłać sygnał do innego procesu
2
 
Nazwy sygnałów
Sygnały nie mogą bezpośrednio przenosić informacji, co ogranicza ich
użyteczność jako ogólnego mechanizmu komunikacji między
procesami. Jadnak każdy typ sygnału posiada nadaną mnemoniczną
nazwę, wskazującą cel w jakim sygnał jest zwykle używany. Nazwy
sygnałów są zdefiniowane w pliku nagłówkowym <signal.h> .
Większość sygnałów Unixowych jest przeznaczona do użycia przez
jądro, chociaż istnieje również kilka do przesyłania między zwykłymi
procesami. Oto kilka wybranych, najczęściej używanych sygnałów:
SIGABRT sygnał przerwania procesu wysyłany przez bieżący proces
za pomocą funkcji abort . Obsługa tego syganłu powinna się
zakończyć tzw. zakończeniem anormalnym . W rzeczywistości
następuje zrzut rdzenia ( core dump ) do pliku w celu dalszej
analizy.
SIGALRM tzw. zegar alarmu. Wysyłany do procesu przez jądro, gdy
upłynie ustalony czas. Wszystkie procesy mają w sumie do
dyspozycji trzy czasomierze.Czasomierz jest ustawiany przez
proces za pomocą funkcji alarm .
3
 
Nazwy sygnałów
cd
SIGCHLD proces potomny zakończony lub zatrzymany. Zawsze, gdy
proces potomny kończy się lub zatrzymuje, jądro zawiadamia o
tym jego proces rodzicielski, wysyłając mu ten sygnał. Domyślnie
proces rodzicielski ignoruje sygnał, więc jeżeli chce wiedzieć o
każdym ukończonym procesie, musi jawnie przechwytywać sygnał.
SIGCONT kontynuuj proces, jeżeli był zatrzymany. Jest to sygnał
sterowania pracą, który powinien wznowić proces, jeżeli został
zatrzymany. W przeciwnym przypadku proces powiniem ignorować
sygnał. Stanowi on przeciwieństwo sygnału SIGSTOP .
SIGFPE wyjątek zmiennoprzecinkowy. Wysyłany przez jądro, gdy
wystapi błąd obliczeń zmiennoprzecinkowych, np. nadmiar lub
niedomiar. Powoduje anormalne zakończenie.
SIGINT przerwanie. Wysyłany przez jądro do wszystkich procesów
powiązanych z sesją terminala, gdy użytkownik wciśnie klawisz
przerwania (Ctrl-c). Jest to powszechnie stosowany sposób
zatrzymania działającego programu.
4
 
Nazwy sygnałów
cd II
SIGHUP sygnał zawieszenia. Wysyłany przez jądro do wszystkich
procesów powiązanych z terminalem sterujacym , jeśli zostaje on
odłączony. Wysłany także do wszystkich członków sesji, gdy kończy
się proces wiodący sesji, którym zwykle jest proces powłoki, pod
warunkiem, że sesja jest powiązana z terminalem sterującym.
Dzięki temu, po wylogowaniu użytkownika, jego procesy dziłające
w tle są kończone (o ile nie wyłączono obsługi tego sygnału).
SIGILL nielegalna instrukcja. Wysyłany przez system, gdy proces
próbuje wykonać nielegalna instrukcję. Staje się to możliwe, gdy
program uszkodzi swój własny kod lub próbuje wykonać instrukcję
zmiennoprzecinkową bez odpowiedniego wsparcia sprzętowego.
Sygnał powoduje anormalne zakończenie procesu.
5
 
Zgłoś jeśli naruszono regulamin