Interfejs uzytkownika - sygnały

ŁF
<style> table {font-size: 10pt} h3 { color: #000000; font-weight: bold; font-size: 18pt; background-color: #e8d5ba; text-align: center; padding: 5; border: double 1pt; width: 100%; margins: 0; paddings: 4 } h4 { color: #000000; font-weight: bold; font-size: 16pt; background-color: #c5dcdc; text-align: center; padding: 5; border: double 1pt; width: 100%; margins: 0; paddings: 4 } h5 { color: #000000; font-weight: normal; font-size: 11pt; background-color: #c5dcc5; text-align: left; padding: 5; border: double 1pt; width: 100%; margins: 0; paddings: 4 } h6 { color: #0000cd; font-weight: bold; font-size: 12pt; font-family: monospace, Courier, "Courier CE"; text-align: left; text-indent: 10pt; word-spacing: 3pt; width: auto } em { color: #0000cd; font-weight: normal; font-size: 12pt; font-family: Courier, "Courier CE"; text-align: left; text-indent: 10pt; word-spacing: 0pt; width: auto } </style>

LINUX - Interfejs użytkownika.

Sygnały

</span>

Sygnał stanowi asynchroniczną informację dla procesu. Umożliwia asynchroniczne przerwanie działania procesu w celu poinformowania go o określonym zdarzeniu. Po obsłużeniu sygnału proces wznawia działanie od miejsca przerwania.

Dostarczaniem sygnału do procesu zawsze zajmuje się jądro systemu, ale informacja może być wysłana przez samo jądro, przez inny (a nawet ten sam) proces lub przez użytkownika. Zastosowanie sygnałów może być bardzo szerokie. I tak na przykład:

  • jądro może poinformować proces o wykonaniu niedozwolonej operacji, zakończeniu jednego z procesów potomnych lub zajściu innego zdarzenia, na które proces oczekuje,
  • proces współpracujący może poinformować o zakończeniu obliczeń a sam proces może ustawić sobie czas pobudki,
  • użytkownik może spowodować wstrzymanie lub zakończenie niewłaściwie działającego procesu.
<dl> <dt> </dl>
(2.1) Przegląd sygnałów

W systemie Linux zdefiniowane są 32 sygnały. Każdy sygnał ma unikalną nazwę i numer, przy czym numery niektórych sygnałów mogą się zmieniać w zależności od implementacji. W tablicy 2.3 zebrano informacje o najczęściej używanych sygnałach.

<font size="+1">Tablica 2.3. </span><font size="+1">Sygnały w systemie Linux.</span>

</caption> <font size="+1">Nazwa sygnału</span></th>
<font size="+1">Numer sygnału </span>
</th>
<font size="+1">Znaczenie</span>
</th>
<font size="+1">Domyślna reakcja procesu</span>
</th> </tr> SIGHUP</td>
1
</td> Zerwanie połączenia z terminalem sterującym</td> Zakończenie procesu</td> </tr> SIGINT</td>
2
</td> Przerwanie</td> Zakończenie procesu</td> </tr> SIGQUIT</td>
3
</td> Zakończenie procesu</td> Zakończenie procesu i zrzut obrazu pamięci do pliku core</td> </tr> SIGILL</td>
4
</td> Nielegalna instrukcja w kodzie</td> Zakończenie procesu</td> </tr> SIGKILL</td>
9
</td> Zabicie procesu</td> Bezwzględne zakończenie procesu</td> </tr> SIGSEGV</td>
11
</td> Przekroczenie dopuszczalnego adresu pamięci</td> Zakończenie procesu</td> </tr> SIGALRM</td>
14
</td> Alarm programowy</td> Ignorowanie</td> </tr> SIGTERM</td>
15
</td> Przerwanie programowe</td> Zakończenie procesu</td> </tr> SIGCONT</td>
zależny od implementacji
</td> Wznowienie wykonywania procesu</td> Wznowienie wykonywania procesu</td> </tr> SIGSTOP</td>
zależny od implementacji
</td> Bezwzględne zatrzymanie procesu</td> Bezwzględne wstrzymanie wykonywania procesu</td> </tr> SIGTSTP</td>
zależny od implementacji
</td> Zatrzymanie procesu w wyniku wprowadzenie z terminala sekwencji Ctrl-z</td> Wstrzymanie wykonywania procesu</td> </tr> SIGCHLD</td>
zależny od implementacji
</td> Informacja o zakończeniu (śmierci) procesu potomnego</td> Ignorowanie</td> </tr> SIGUSR1</td>
zależny od implementacji
</td> Sygnał definiowany przez użytkownika</td> Niezdefiniowana</td> </tr> SIGUSR2</td>
zależny od implementacji
</td> Sygnał definiowany przez użytkownika</td> Niezdefiniowana</td> </tr> </table>


(2.2) Wysyłanie sygnałów
</p>

Użytkownik może wysłać sygnał do procesu posługując się poleceniem kill:

kill [-sygnał] pid

gdzie:

sygnał - to numer (np. 9) lub nazwa sygnału (np. KILL),
pid - to identyfikator procesu (PID).

W przypadku pominięcia argumentu sygnał, domyślnie wysyłany jest sygnał SIGTERM.

Zwykły użytkownik może wysyłać sygnały tylko do swoich procesów, natomiast administrator może wysyłać dowolne sygnały do wszystkich procesów.

W celu wysłania niektórych sygnałów do grupy procesów pierwszoplanowych można posłużyć się specjalnymi sekwencjami klawiszy, zdefiniowanymi w powłoce. Zwyczajowe ustawienia przedstawiono w tablicy 2.4.

<font size="+1">Tablica 2.4. </span><font size="+1">Sekwencje znaków pozwalające na wysłanie sygnałów.</span></caption> <font size="+1">Sekwencja</span></th> <font size="+1">Wysyłany sygnał</span></th> </tr>
<font size="+1">Ctrl-c</span>
</td>
<font size="+1">SIGINT</span>
</td> </tr>
<font size="+1">Ctrl-\</span>
</td>
<font size="+1">SIGQUIT</span>
</td> </tr>
<font size="+1">Ctrl-z</span>
</td>
<font size="+1">SIGTSTP</span>
</td> </tr> </table>


(2.3) Obsługa sygnałów w procesie

Po otrzymaniu sygnału proces musi zareagować w sposób zdefiniowany w kodzie programu. Istnieją 3 sposoby obsługi sygnałów:

  1. domyślna reakcja ze strony jądra systemu (patrz Tablica 2.1),
  2. ignorowanie sygnału,
  3. przechwycenie sygnału i wykorzystanie własnej funkcji obsługi zdefiniowanej w programie.

Każdy nowy proces przejmuje (dziedziczy) ustawienia sposobu obsługi sygnałów od swojego procesu macierzystego. Te ustawienia mogą być potem przedefiniowane w kodzie programu.

Możliwe jest również blokowanie przez proces odbierania poszczególnych sygnałów. W takim przypadku jądro przechowuje nadesłane do procesu sygnały do momentu odblokowania ich odbioru.

Sygnały SIGKILL i SIGSTOP muszą być obsługiwane w sposób domyślny, a więc nie mogą być blokowane, ignorowane ani przechwytywane. Zapewnia to możliwość wstrzymania bądź zakończenia niewłaściwie działającego procesu.

Polecenie trap umożliwia ustawienie obsługi poszczególnych sygnałów przez powłokę. Ustawienia te zostaną przekazane wszystkim nowym procesom uruchomianym przez powłokę.

trap [polecenie] [sygnał]

gdzie:

sygnał - to numer (np. 9) lub nazwa sygnału (np. KILL),
polecenie - to nazwa polecenia (z argumentami), które zostanie wykonane po odbiorze podanego sygnału..

Polecenie trap rejestruje wskazane w argumencie polecenie do obsługi podanego sygnału. Podanie pustego napisu zamiast argumentu polecenie spowoduje ustawienie ignorowania sygnału. Pominięcie argumentu polecenie przywróci domyślny sposób obsługi. Pominięcie obydwu argumentów spowoduje wypisanie wszystkie poleceń przypisanych do sygnałów.

Sterowanie pracami

</span>

Pojęcie sterowanie pracami oznacza możliwość selektywnego wstrzymywania i wznawiania procesów na pierwszym planie lub w tle.

Odpowiednich mechanizmów dostarcza tu powłoka oraz program emulacji terminala. Powłoka związuje pracę z każdym procesem lub grupą procesów tworzących potok.W ramach jednej sesji może istnieć jedna praca pierwszoplanowa i wiele prac drugoplanowych lub wstrzymanych.

Listę wszystkich prac wraz z ich numerami można uzyskać poleceniem jobs:

jobs [-l]

Polecenie wyświetla numery i nazwy prac. Opcja `l` (litera el) umożliwia dodatkowo uzyskanie numerów PID procesów.

Wstrzymanie wykonywania procesu następuje w wyniku odebrania odpowiedniego sygnału. Procesy pierwszoplanowe można zatrzymać wysyłając do nich sygnał SIGTSTP poprzez sekwencję znaków Ctrl-z (patrz Lekcja 2, SEGMENT 2). Do procesów drugoplanowych możemy wysłać sygnał poleceniem kill:

kill [-sygnał] %praca

gdzie:

praca - to numer pracy lub ciąg znaków identyfikujący nazwę pracy.

Wznawianie procesów na pierwszym planie i w tle realizują odpowiednio polecenia fg i bg (nazwy pochodzą od angielskich słów foreground i background):

fg [%praca]
bg [%praca]

Wywołanie poleceń bez argumentu powoduje wznowienie bieżącej pracy tzn. takiej, która jako ostatnia została wstrzymana lub uruchomiona w tle. Dostępne są też argumenty + i ? oznaczające odpowiednio bieżącą i poprzednią pracę.

Przeniesienie działającego procesu z pierwszego planu do tła można zrealizować w następujący sposób:

  1. zatrzymać proces sekwencją Ctrl-z,
  2. wznowić proces w tle poleceniem bg.

Działanie odwrotne wymaga jedynie użycia polecenia fg.


Przykład.
Poniżej, na Rys.2.4, pokazano przykład sterowania pracami. Na wstępie użytkownik zj uruchomił w pierwszym planie program netscape. Następnie wysłał do tego procesu sygnał SIGTSTP naciskając na klawiaturze kombinację Ctrl-z. Wykonywanie procesu zostało zatrzymane, co potwierdzono zostało przez komunikat wypisany na terminalu. W dalszej kolejności użytkownik sprawdził przy pomocy polecenia jobs -l jakie prace istnieją aktualnie w tej powłoce, po czym wznowił wykonywanie procesu netscape w tle (poleceniem bg) i sprawdził czy proces rzeczywiście się wykonuje (poleceniem jobs -l). Potem uruchomił w tle dwa nowe procesy: nowy terminal (poleceniem xterm &) oraz zegar (poleceniem xclock &). Na koniec użytkownik ponownie wypisał listę prac w powłoce.

JOBS.GIF
Rys.2.4 Przykład sterowania pracami

Autorami powyższego artykułu są mgr inż. A. Wielgus i dr Z. Jaworski. Drobnych zmian i poprawek dokonał Ł. Fronczyk
W dziale źródła/C++ znajdują się przykładowe programy do tego i pozostałych artykułów z tego cyklu.
Wszelkie pytania proszę kierować na adres [email protected]

2 komentarzy

Ogólnie przystępnie opisane, jedynie formatowanie się rozjechało i na mojej przegladarce (Firefox && Linux MINT) widać znaczniki kodu HTML. Co do samych sygnałów to dla uzupełnienia można przeczytać jeszcze - http://tomaszpluta.aq.pl/linux_sygnaly.html (są przykłady programów w C dotyczących obsługi sygnałów)

Strasznie tu dużo białych znaków. Czyżby autor postanowił przekazać podwójną wiadomość i wysłać program napisany w whitespace?...