Do spisu tresci tematu 1

1.5.1 Sygnaly - opis

Spis tresci


Wprowadzenie

Sygnal jest informacja dla procesu, ze wystapilo jakies zdarzenie.Czasem sygnaly nazywamy przerwaniami programowymi (czyli generowanymi przez oprogramowanie). Sygnaly zazwyczaj wysylane sa asynchronicznie, czyli proces nie wie z gory, w ktorym momencie pojawi sie jakis sygnal.
Oto, czym roznia sie od komunikatow:

1. Sygnaly nie przenosza zadnych informacji, w szczegolnosci odbiorca sygnalu nie zna tozsamosci nadawcy
2. Sygnal moze byc wyslany w dowolnym czasie, sporadycznie przez inny proces (sygnaly moze tez wysylac proces sam do siebie), a najczesciej przez jadro systemu w wyniku pewnego wyjatkowego zdarzenia (np. zerwania lacznosci z terminalem)
3. Ogolnie, nie ma bezwzglednej koniecznosci odbierania sygnalow ani tez reagowania na nie.Domyslnie, wiekszosc sygnalow powoduje zakonczenie wykonywania procesu odbierajacego sygnal.Proces moze jednak zazadac ignorowania okreslonego rodzaju sygnalow. Zobacz tez rozdzial Co proces moze zrobic z sygnalem?
4.Sygnaly moga byc wysylane wylacznie do procesow, a nie do kolejki komunikatow

Ogolnie, sygnaly slabo sprawdzaja sie jako mechanizm komunikacji miedzy procesami (w sytuacjach wyjatkowych sa natomiast niezastapione).


Tabela sygnalow

Kazdy sygnal ma nazwe opisana w pliku naglowkowym <signal.h>.Oto zestawienie nazw wszystkich sygnalow wraz z okresleniem ich znaczenia i czynnosci domyslnych.W kolumnie ¨Uwagi¨ zawarta jest informacja o tym, dla ktorej wersji Unixa - systemu 4.3BSD czy Systemu V - jest charakterystyczny dany sygnal. Brak uwag oznacza, ze dany sygnal wystepuje w obu systemach.W kolumnie oznaczonej ¨L¨ umieszczony jest numer danego sygnalu w Linuxie 2.0.20; brak numeru oznacza, ze dany sygnal nie wystepuje w tym systemie.¨*¨ w kolumnie ¨Znaczenie¨ oznacza, ze w tej wersji Linuxa sygnal nie zostal jeszcze zaimplementowany.

Nazwa L Uwagi Znaczenie Czynnosc domyslna
SIGABRT 6 Tylko Linux Samobojstwo Zakoncz. z obrazem pamieci
SIGALRM 14 - Budzik Zakonczenie
SIGBUS 7 - Blad szyny Zakoncz. z obrazem pamieci
SIGCHLD
(SIGCLD)
17 - Zakonczenie procesu potomnego Ignorowany
SIGCONT 18 4.3BSD Wznowienie wstrzymanego procesu Ignorowany
SIGEMT - - Blad sprzetowy (rozkaz EMT) Zakonczenie z obrazem pamieci
SIGFPE 8 - Blad sprzetowy (rozkaz FPE) Zakoncz. z obrazem pamieci
SIGHUP 1 - Zawieszenie Zakonczenie
SIGILL 4 - Niedozwolony rozkaz Zakoncz. z obrazem pamieci
SIGINT 2 - Znak przerwania Zakonczenie
SIGIO 29 4.3BSD We.-wy. dozwolone dla deskryptora pliku Ignorowany
SIGIOT 6 - Blad sprzetowy (rozkaz IOT) Zakoncz. z obrazem pamieci
SIGKILL 9 - Zakonczenie procesu Zakonczenie
SIGPIPE 13 - Dane nie sa odbierane z lacza kom. Zakonczenie
SIGPOLL 29 System V Zdarzenie dotyczace urzadzenia strum. Zakonczenie
SIGPROF 27 4.3BSD Budzik profilometra Zakonczenie
SIGPWR 30 System V Brak zasilania Zakonczenie
SIGQUIT 3 - Znak zakonczenia Zakoncz. z obrazem pamieci
SIGSEGV 11 - Naruszenie segmentacji Zakoncz. z obrazem pamieci
SIGSTKFLT 16 Tylko Linux * Zakonczenie
SIGSTOP 19 4.3BSD Zatrzymanie Zatrzymanie procesu
SIGSYS - - Niedozwolony argument funkcji sys. Zakoncz. z obrazem pamieci
SIGTERM 15 - Programowe zakonczenie procesu Zakonczenie
SIGTRAP 5 - Pulapka sledzenia Zakoncz. z obrazem pamieci
SIGTSTP 20 4.3BSD Wprowadzenie znaku zatrzymania Zatrzymanie procesu
SIGTTIN 21 4.3BSD Czytanie w tle z terminala sterujacego Zatrzymanie procesu
SIGTTOU 22 4.3BSD Pisanie w tle na terminalu sterujacym Zatrzymanie procesu
SIGUNUSED 31 Tylko Linux * Zakonczenie
SIGURG 23 4.3BSD Dane wysokopriorytetowe w gniezdzie Ignorowany
SIGUSR1 10 - Zdefiniowany przez uzytkownika Zakonczenie
SIGUSR2 12 - Zdefiniowany przez uzytkownika Zakonczenie
SIGVTALRM 26 4.3BSD Budzik zegara wirtualnego Zakonczenie
SIGWINCH 28 4.3BSD Zmiana rozmiaru okna Ignorowany
SIGXCPU 24 4.3BSD Przekroczenie czasu procesora Zakonczenie
SIGXFSZ 25 4.3BSD Przekroczenie rozmiaru pliku Zakonczenie


Co proces moze zrobic z sygnalem?

Co proces moze zrobic z otrzymanym sygnalem?


Krotkie omowienie sygnalow

Wprowadzenie

Omowimy teraz wszystkie sygnaly i ich niektore wlasnosci. Kilka sygnalow przeznaczono do obslugi sytuacji wyjatkowych zaleznych od sprzetu. Sygnaly te wywodza sie z pierwotnej wersji Unixa dla maszyny PDP-11. W maszynie tej wektory przerwan przechowywane w dolnym obszarze pamieci odpowiadaja nastepujacym sytuacjom: blad szyny, rozkaz niedozwolony, pulapka sledzenia, brak zasilania, pulapka IOT i pulapka EMT. Nazwy: IOT oraz EMT sa kodami symbolicznymi rozkazow maszyny PDP-11, ktore przekazuja sterowanie z procesu uzytkownika do jadra systemu. Nadal istnieja sygnaly odpowiadajace tym rozkazom, chociaz maja juz inne znaczenie w systemach dla innych maszyn niz PDP-11.

Opis sygnalow

Sygnaly omowione sa w kolejnosci alfabetycznej. Wytluszczonym drukiem oznaczone sa sygnaly Linuxa 2.0.20, w nawiasach podane sa ich numery. Symbolem ¨*¨ oznaczone sa sygnaly wystepujace jedynie w Linuxie.

- SIGABRT* (6)

Samobojstwo. Zobacz opis sygnalu SIGIOT o tym samym numerze.

- SIGALRM (14)

Sygnal pobudki. Sygnal ten generowany jest po uplywie wskazanego przez proces czasu. Czas pobudki okresla sie za pomoca funkcji systemowej alarm; jej argument sec okresla czas rzeczywisty, nie zas czas jednostki centralnej.

- SIGBUS (7)

Blad szyny. Sygnal ten jest generowany po wystapieniu bledu sprzetowego spowodowanego przez niepoprawna implementacje systemu.

- SIGCLD , SIGCHLD (17)

Smierc potomka. Sygnal ten wysylany jest do procesu macierzystego wtedy, gdy zakonczy sie jego proces potomny. W przeciwienstwie do wiekszosci sygnalow, sygnal ten ginie, jezeli proces go nie przechwyci. W systemach: 4.3BSD i Linux sygnal ten wskazuje rowniez, iz zmienil sie stan procesu potomnego. Jest to ogolniejsze niz tylko wskazywanie smierci potomka. Zmiana stanu moze oznaczac jego smierc, ale moze takze wynikac z zatrzymania tego procesu przez sygnaly SIGSTOP, SIGTTIN, SIGTTOU lub tez SIGTSTP.

- SIGCONT (18) (4.3BSD)

Wznowienie wstrzymanego procesu. Sygnal ten wysylany jest, kiedy w systemie 4.3BSD podejmuje sie dalszy ciag dzialania procesu, ktory zostal wstrzymany (zob. opisy sygnalow SIGSTOP i SIGTSTP). Jesli np. zatrzymano prace edytora pelnoekranowego, to przed jej wznowieniem moze on odtworzyc obraz wyswietlany uprzednio na ekranie.

- SIGEMT

Blad sprzetowy (instrukcja emulatora EMT). Sygnal ten jest wysylany po wystapieniu bledu sprzetowego spowodowanego przez niewlasciwa implementacje systemu.

- SIGFPE (8)

Blad sprzetowy (rozkaz FPE). Sygnal wysylany po wystapieniu wykrywanej sprzetowo sytuacji wyjatkowej, spowodowanej niewlasciwa implementacja systemu. Na przyklad system 4.3BSD dla maszyny VAX uzywa tego sygnalu do wskazywania sytuacji wyjatkowych podczas wykonywania operacji zmiennopozycyjnych (np. niedomiar zmiennopoz.) oraz sytuacji wyjatkowych podczas wykonywania operacji na liczbach calkowitych (np. dzielenie przez zero).

- SIGHUP (1)

Zerwanie lacznosci - sygnal zawieszenia (ang. hangup ). Po zerwaniu lacznosci z terminalem sygnal ten wysylany jest do wszystkich procesow, dla ktorych dany terminal jest terminalem sterujacym. Wysylany jest takze do wszystkich procesow nalezacych do danej grupy procesow w chwili zakonczenia, z dowolnego powodu, procesu bedacego przywodca tej grupy. W ten sposob jest symulowane zerwanie lacznosci z terminalami, ktorych nie mozna odlaczyc fizycznie, jak np. komputerow osobistych.

- SIGILL (4)

Niedozwolona instrukcja. Sygnal ten jest wysylany po wystapieniu wykrywanej sprzetowo sytuacji wyjatkowej, spowodowanej przez niewlasciwa implementacje systemu.

- SIGINT (2)

Sygnal przerwania (ang.interrupt ). Jest zazwyczaj wysylany do wszystkich procesow zwiazanych z danym terminalem, gdy uzytkownik nacisnie klawisz przerwania. Mozna zniesc takie dzialanie klawisza przerwania, a takze mozna zmienic sam klawisz, wywolujac funkcje systemowa ioctl.

- SIGIO (29) (4.3BSD)

We.-wy. dozwolone dla deskryptora pliku. Sygnal ten wskazuje, ze mozna wykonywac operacje wejscia-wyjscia w odniesieniu do deskryptora pliku. Sygnalu tego uzywa sie do stworzenia pewnej postaci asynchronicznego wejscia-wyjscia dla procesu.

- SIGIOT (6)

Blad sprzetowy (rozkaz IOT). Sygnal ten jest generowany po wystapieniu bledu sprzetowego spowodowanego przez niewlasciwa implementacje systemu. Ponadto wersja funkcji abort w Systemie V wysyla ten sygnal do biezacego procesu (jest to przypadek wysylania sygnalu przez proces do samego siebie). Proces wywoluje funkcje abort celu utworzenia obrazu pamieci i zakonczenia dzialania po wystapieniu nietypowego bledu. Wersja funkcji abort systemie 4.3BSD wysyla sygnal SIGIOT do siebie, aby utworzyc obraz pamieci i zakonczyc dzialanie (w Linuxie funkcja ta wysyla sygnal SIGABRT o tym samym numerze co sygnal SIGIOT).

- SIGKILL (9)

Unicestwienie. Jest to jedyny calkowicie pewny sposob zakonczenia wykonywania procesu, poniewaz proces odbierajacy ten sygnal nie moze go ani zignorowac, ani przechwycic. Sygnalu tego powinno sie uzywac tylko w sytuacjach wyjatkowych, w pozostalych natomiast zalecany jest sygnal SIGTERM.

- SIGPIPE (13)

Dane nie sa odbierane z lacza komunikacyjnego. Sygnal ten wskazuje, ze nie mozemy juz dluzej wysylac danych do gniazda, lacza komunikacyjnego lub kolejki FIFO. Dopoki proces nie przechwyci tego sygnalu, dopoty czynnoscia domyslna jest zakonczenie procesu. Sygnal jest wysylany tylko do procesu zwiazanego z danym gniazdem, nie dotyczy zas grupy procesow.

- SIGPOLL (29)(System V)

Zdarzenie dotyczace urzadzenia strumieniowego. Sygnal ten oznacza, ze w urzadzeniu zewnetrznym przyporzadkowanym strumieniowi wystapilo jedno z okreslonych zdarzen. W Systemie V sygnal ten umozliwia procesowi wykonywanie asynchronicznych operacji wejscia-wyjscia na jednym lub wiekszej liczbie urzadzen strumieniowych. W Linuxie utozsamiono ten sygnal z sygnalem SIGIO wywodzacym sie z systemu 4.3BSD (patrz sygnal SIGIO)

- SIGPROF (27) (4.3BSD)

Budzik profilometra. W systemie 4.3BSD i w Linuxie istnieja trzy rodzaje mechanizmow zegarowych sluzacych do sterowania budzikami: zegar zwiazany z sygnalem SIGALRM odmierza czas rzeczywisty dla procesu; zegar wirtualny zwiazany z sygnalem SIGVTALRM odmierza czas wirtualny procesu (czas wykonywania procesu); wreszcie zegar profilometra zwiazany z sygnalem SIGPROF odmierza zarowno czas wirtualny procesu, jak i czas, w ktorym jadro pracuje na rzecz procesu. Sygnalu SIGPROF uzywa sie w interpretatorach do profilowania wykonania interpretowanego programu.

- SIGPWR (30) (System V)

Niedobor mocy. Dokladne znaczenie tego sygnalu zalezy od konkretnej implementacji. Jedna z mozliwosci polega na wysylaniu go po wykryciu znacznego spadku napiecia w sieci elektrycznej (napiecie spadlo np. o 100V i nadal spada). Proces ma wowczas bardzo malo czasu na kontynuacje pracy - powinien wiec na ogol zrobic porzadek i zakonczyc sie (podobnie, jak po otrzymaniu sygnalu SIGTERM).

- SIGQUIT (3)

Zakonczenie. Sygnal ten jest podobny do sygnalu SIGINT, ale jest on generowany, gdy uzytkownik nacisnie na terminalu klawisz zakonczenia, ponadto uzyskujemy zrzut zawartosci pamieci.

- SIGSEGV (11)

Naruszenie segmentacji. Sygnal wysylany po wystapieniu bledu sprzetowego spowodowanego niewlasciwa implementacja systemu. Na ogol pojawia sie, kiedy proces odwola sie do takiego adresu w pamieci, do ktorego nie ma dostepu.

- SIGSTKFLT* (16) - sygnal nie jest w Linuxie zaimplementowany (stack fault?)

- SIGSTOP (19) (4.3BSD)

Zatrzymanie. Sygnal ten zatrzymuje proces. Podobnie jak sygnalu SIGKILL, nie mozna sygnalu SIGSTOP  zignorowac, ani przechwycic.Umozliwia on administratorowi systemu zatrzymanie procesu. Sygnalem SIGCONT mozna wznowic dzialanie zatrzymanego procesu.

- SIGSYS

Niedozwolony argument funkcji systemowej. Sygnal ten wskazuje, ze funkcje systemowa wywolano w niepoprawny sposob. Ponadto - z powodow historycznych - sygnal ten jest generowany kiedy argument whence (skad) funkcji systemowej lseek jest rozny od 0,1 lub 2.

- SIGTERM (15)

Zakonczenie programowe. Jest to standardowy sygnal zakonczenia wywolywania procesu, generowany przez oprogramowanie, wysylany domyslnie do procesu wtedy, kiedy uzyje sie polecenia kill (Nie mylic polecenia kill z funkcja systemowa o tej samej nazwie). Sygnalu tego uzywa sie takze podczas wylaczania calego systemu w celu zakonczenia wszystkich aktywnych procesow.Programy powinny przyjmowac domyslna obsluge tego sygnalu badz tez blyskawicznie robic porzadek (np. usunac pliki tymczasowe) i wywolywac funkcje exit.

- SIGTRAP (5)

Sledzenie. Sygnal ten jest wysylany po wykonaniu kazdej instrukcji, jesli proces wykonywany jest z opcja sledzenia wlaczona za pomoca funkcji ptrace. Z opcji sledzenia korzystaja programy diagnostyczne, wspomagajace testowanie programow.

- SIGTSTP (20) (4.3BSD)

Wprowadzenie znaku zatrzymania. Sygnal ten jest wysylany do procesu po nacisnieciu klawisza zawieszenia (na ogol Control-Z) lub klawisza zawieszenia z opoznieniem (na ogol Control-Y). Proces, ktory byl zawieszony (zatrzymany), mozna wznowic sygnalem SIGCONT.

- SIGTTIN (21) (4.3BSD)

Czytanie w tle z terminala sterujacego. Sygnal ten jest wysylany wtedy, gdy proces drugoplanowy przystepuje do czytania ze swego terminala sterujacego. System generuje ten sygnal, aby uniknac zamieszania spowodowanego tym, ze wiecej niz jeden proces czyta z tego samego urzadzenia. Jesli proces zignoruje ten sygnal, to bedzie domyslnie zatrzymany.

- SIGTTOU (22) (4.3BSD)

Pisanie w tle na terminalu sterujacym. Sygnal zblizony do sygnalu SIGTTIN, wysylany wtedy, gdy proces drugoplanowy przystepuje do pisania na swoim terminalu sterujacym.Domyslnie jest dozwolone, aby proces drugoplanowy pisal na swoim terminalu sterujacym, ale uzytkownik moze okreslic, ze operacja pisania w tle wygeneruje ten sygnal.

- SIGUNUSED* (31) - sygnal niezaimplementowany w Linuxie.

- SIGURG (23) (4.3BSD)

Dane wysokopriorytetowe w gniezdzie. Sygnal wysylany po powstaniu sytuacji wyjatkowej zwiazanej z nadejsciem danych wysokopriorytetowych do gniazda albo z obecnosci informacji o stanie sterowania, ktora trzeba odebrac od czesci nadrzednej pseudoterminala pracujacego w trybie pakietowym. Sygnal jest wysylany do grupy procesow dla tego gniazda.

- SIGUSR1 (10)

Sygnal 1 zdefiniowany przez uzytkownika. Z sygnalu tego mozna korzystac w programach uzytkowych w celu komunikacji miedzy procesami. Sygnal ten nie jest czesto uzywany - nie moze bowiem przeniesc zadnej informacji poza ta, ze wlasnie sie pojawil. Nie jest wiec zbyt uzyteczny, jezeli ma sluzyc do komunikacji miedzy wieksza liczba procesow: odbiorca nie wie, kto jest nadawca sygnalu.

- SIGUSR2 (12)

Sygnal 2 zdefiniowany przez uzytkownika. Analogiczny do sygnalu SIGUSR1.

- SIGVTALRM (26) (4.3BSD)

Budzik zegara wirtualnego. Zobacz opis sygnalu SIGPROF.

- SIGWINCH (28) (4.3BSD)

Zmiana rozmiaru okna. Sygnal oznacza, ze rozmiar okna na terminalu zmienil sie.

- SIGXCPU (24) (4.3BSD)

Przekroczenie czasu procesora. W systemie 4.3BSD oraz w Linuxie mozna w procesie ustalic ograniczenia zasobow, z ktorych bedzie korzystal dany proces i kazdy utworzony przez niego proces. Sygnal SIGXCPU wskazuje, ze proces przekroczyl przydzielony mu czas procesora.

- SIGXFSZ (25) (4.3BSD)

Przekroczenie rozmiaru pliku. Sygnal ten wskazuje, ze proces przekroczyl ograniczenie rozmiaru jego plikow. Zob. opis sygnalu SIGXCPU.


Bibliografia


Autor : Adam Wachowski