Wprowadzenie do systemu operacyjnego Linux zarzdzanie procesami, cz. 2 PCSS
plan funkcje i struktura jdra funkcje systemowe, pułapki i przerwania zarzdzanie procesami: charakterystyka ogólna tworzenie, usuwanie i zawieszanie procesu polecenia dotyczce procesów sygnały i ich wykorzystywanie 2
plan zarzdzanie pamici operacyjn zarzdzanie urzdzeniami wejcia/wyjcia zarzdzanie plikami uwagi kocowe bibliografia 3
sygnały sygnał jest odpowiedzi jdra systemu na wyjtkowy stan, jaki wystpił podczas wykonywania programu przez uytkownika stanem tym moe by nacinicie klawisza Del, albo wykrycie przez system nielegalnej operacji 4
sygnały sygnał przerywa normalne wykonywanie programu i rozpoczyna akcj jego zakoczenia albo wywietla komunikat o błdzie 5
akcje domylne dopuszczalne s nastpujce akcje domylne, po wystpieniu sygnału: zakocz proces (Term) ignoruj sygnał (Ign) utwórz obraz pamici (Core) zawie proces (Stop) kontynuuj proces (Cont) 6
stany procesu [KS1993] IDLE przydziel zasoby RUN wyjd ZOMBIE upij zawie SLEEP obud odwie STOP 7
struktura jdra [KS1993] proces uytkownika funkcja systemowa pułapka czobsł. zastosowania czobsł. przerwania sprzt przerwania 8
funkcje systemowe w czasie wykonywania funkcji systemowej mog wystpi dwa zdarzenia: do procesu moe by przesłany sygnał, albo inny proces moe osign wyszy priorytet 9
funkcje systemowe jeeli do procesu zostanie przesłany sygnał, to moe on spowodowa zaniechanie wykonywania funkcji systemowej inna moliwo, to zawieszenie sygnału do czasu zakoczenia funkcji 10
pułapki pułapki mog wystpi z powodu błdu w programach (dzielenie przez zero), albo błdów systemowych proces jest informowany o problemie albo za pomoc sygnału, albo przez sam fakt zakoczenia 11
sygnały w systemie Linux przedstawimy obecnie sygnały, wystpujce w systemie Linux naley pamita, e w poprzednich systemach uniksowych (POSIX, ANSI, 4.2 BSD, System V, Sun) zestawy sygnałów si róniły 12
sygnały w systemie Linux nazwa warto opis akcja domylna SIGHUP 1 linia terminalu zawieszona SIGINT 2 przerwanie programu SIGQUIT 3 wyjcie z programu SIGILL 4 nielegalna instrukcja SIGTRAP 5 nakaz ledzenia procesu zakocz proces zakocz proces utwórz obraz pamici utwórz obraz pamici utwórz obraz pamici 13
sygnały w systemie Linux nazwa warto opis akcja domylna SIGIOT 6 wystpienie pułapki przy wykonaniu operacji we/wy utwórz obraz pamici SIGBUS 7 błd magistrali utwórz obraz pamici SIGFPE 8 błd przy operacji zmiennoprzecinko wej utwórz obraz pamici SIGKILL 9 zabicie procesu zakocz proces SIGUSR1 10 sygnał zdefiniowany przez uytkownika 1 zakocz proces 14
sygnały w systemie Linux nazwa warto opis akcja domylna SIGSEGV 11 naruszenie segmentacji SIGUSR2 12 sygnał zdefiniowany przez uytkownika 2 utwórz obraz pamici zakocz proces SIGPIPE 13 uszkodzony potok zakocz proces SIGALRM 14 upłynł czas zegara czasu rzeczywistego SIGTERM 15 programowy sygnał zakoczenia zakocz proces zakocz proces 15
sygnały w systemie Linux nazwa warto opis akcja domylna SIGSTKFLT 16 błd stosu koprocesora SIGCHLD 17 powiadomienie przodka o zawieszeniu/ usuniciu potomka SIGCONT 18 zatrzymany proces jest kontynuowany SIGSTOP 19 sygnał zatrzymania spoza terminalu SIGTSTP 20 Sygnał zatrzymania z terminalu zakocz proces odrzu sygnał odrzu sygnał/ kontynuuj proces zawie proces zawie proces 16
sygnały w systemie Linux nazwa warto opis akcja domylna SIGTTIN 21 czytanie z terminalu przez proces drugoplanowy SIGTTOU 22 pisanie na terminalu przez proces drugoplanowy SIGURG 23 pilny warunek w kanale we/wy SIGXCPU 24 przekroczony limit czasu procesora SIGXFSZ 25 przekroczony limit rozmiaru pliku zawie proces zawie proces odrzu sygnał utwórz obraz pamici utwórz obraz pamici 17
sygnały w systemie Linux nazwa warto opis akcja domylna SIGVTALRM 26 upłynł czas zegara czasu wirtualnego SIGPROF 27 upłynł czas zegara profilowania SIGWINCH 28 zmiana rozmiaru okna SIGIO 29 we/wy ponownie moliwe zakocz proces zakocz proces ignoruj sygnał zakocz proces SIGPWR 30 błd zasilania zakocz proces 18
sposób obsługi sygnału z kadym sygnałem zwizana jest akcja, podajca sposób jego obsługi program uytkownika moe w róny sposób reagowa na sygnały, wykorzystujc w tym celu funkcj systemowsignal, albo ostatnio funkcj systemow sigaction 19
sposób obsługi sygnału reakcje programu mog by nastpujce: podjcie akcji domylnej ignorowanie sygnału podjcie akcji własnej 20
akcja domylna akcje najczciej wykonywane to utworzenie obrazu pamici i zakoczenie procesu utworzenie obrazu pamici oznacza zakoczenie procesu z zachowaniem jego stanu, w chwili gdy sygnał został dostarczony stan ten mona potem przeanalizowa debugerem 21
akcja własna akcj własn definiuje uytkownik w programie obsługi sygnału program obsługi sygnału wywoływany jest przez system po odbiorze sygnału przez proces mówimy wtedy, e program obsługi przechwycił lub złapał sygnał 22
akcja własna sygnały, które nie mog by ani zignorowane ani złapane, to SIGSTOP i SIGKILL wykorzystujc te sygnały, mona utworzy mechanizm programowy zabijania procesów 23
implementacja sygnału jest podzielona na dwa etapy: zgłoszenie sygnału do procesu wykonanie sygnału 24
zgłoszenie sygnału do procesu obejmuje: okrelenie akcji, jak proces podejmie dołczenie sygnału do kolejki zawieszonych sygnałów zwizanych z procesem sprawdzenie, czy sygnał jest maskowany 25
implementacja sygnału jeeli sygnał nie jest maskowany, a akcja z nim zwizana jest akcj domyln, obejmujc zakoczenie procesu, zawieszenie procesu albo odrzucenie sygnału, to akcja ta bdzie wykonana 26
wykonanie sygnału obejmuje: pobranie pierwszego z zawieszonych sygnałów wywołanie modułu obsługi sygnału w celu wykonania przez proces akcji własnej zwizanej z sygnałem albo wywołanie procedury utworzenia pliku core, gdy z sygnałem jest zwizana akcja domylna 27
maskowanie sygnałów dostarczanie sygnałów moe by maskowane przez proces stan wykonania kadego procesu zawiera zbiór sygnałów aktualnie maskowanych przy ich dostarczaniu 28
maskowanie sygnałów jeeli sygnał zgłoszony do procesu jest maskowany, to zostaje on zapisany w zbiorze zawieszonych sygnałów procesu i adna akcja nie jest podejmowana, dopóki maskowanie sygnału nie zostanie usunite 29
maskowanie sygnałów zbiór sygnałów maskowanych dla danego procesu jest modyfikowany przez funkcje systemowe sigblock, sigsetmask i sigprocmask system nie pozwala na maskowanie sygnałów SIGKILL, SIGSTOP i SIGCONT 30
maskowanie sygnałów ochrona SIGCONT przed maskowaniem jest konieczna, poniewa od jego dostarczenia uzalenione jest podjcie pracy przez zatrzymane procesy 31
funkcja systemowa signal program uytkownika definiuje akcj, która ma by podjta w przypadku odbioru sygnału za pomoc funkcji systemowej signal aby uy funkcji signal, naley wpierw umieci na pocztku programu w jzyku C nastpujcy wiersz: include <signal.h> 32
funkcja systemowa signal zbiór signal.h definiuje róne literały (stałe literowe), uywane jako argumenty przez funkcj systemow signal wywołanie funkcji signal ma posta: signal(sigtype, ptr) gdzie sigtype okrela sygnał, a ptr jest wskanikiem funkcji definiujcej akcj albo literałem podajcym wczeniej zdefiniowan akcj 33
funkcja systemowa signal wskanik ptr moe by literałem: SIG_IGN brak akcji SIG_DFL akcja domylna podana funkcja zmienia akcj sygnału przerwania na brak akcji: signal(sigint, SIG_IGN) sygnał nie bdzie miał wpływu na program 34
funkcja systemowa signal funkcja signal zawsze zwraca warto wskanika, który definiuje poprzedni akcj sygnału warto ta moe by zastosowana w kolejnych wywołaniach do przywrócenia sygnałowi jego poprzedniej akcji podamy teraz przykłady zastosowania sygnałów 35
przerwanie obu procesów #include <stdio.h> /*dolaczenie opisu funkcji */ /* wejscia/wyjscia z pliku naglowkowego */ main() /* signal1.c, uzycie sygnalu */ { int i,j /* deklaracja licznikow */ if(fork() == 0) /* proces potomny */ for(i = 1; i <= 1000; ++i) /*wyswietla 1000 razy */ printf( proces potomny\n ); /* napis */ else /* proces macierzysty */ for(j = 1; j <= 1000; ++j) /*wyswietla 1000 razy */ printf( proces macierzysty\n ); /* napis */ } 36
przerwanie obu procesów w wyniku uruchomienia programu i nacinicia klawisza Del na ekranie otrzymamy: proces potomny... proces potomny proces macierzysty proces macierzysty proces macie $ nacinicie Del przerywa oba procesy 37
zakaz sygnału zakaz (blokad) sygnału, czyli ochron przed sygnałem, uzyskuje si za pomoc funkcji signal ze stałsig_ign wywołanie funkcji ma posta: signal(sigtype, SIG_IGN) gdzie sigtype jest literałem sygnału, który ma by zakazany 38
zakaz sygnału nastpujca funkcja systemowa blokuje sygnał przerwania: signal(sigint, SIG_IGN) funkcj t mona stosowa aby uchroni program wykonywany w tle, na przykład proces potomny, przed zakoczeniem go przez sygnał 39
blokada sygnału przerwania dla procesu potomnego #include <stdio.h> #include <signal.h> /* plik naglowkowy dla f.signal */ main()/* signal3.c, Del przerywa proces macierzysty*/ { int i,j /* deklaracja licznikow */ if(fork() == 0) { /* proces potomny */ signal(sigint, SIG_IGN); /* blokada sygnalu */ /* przerwania */ for(i = 1; i <= 100; ++i) /*wyswietla 100 razy */ printf( proces potomny %d\n,i); /* napis */ 40
blokada sygnału przerwania dla procesu potomnego } else /* proces macierzysty */ for(j = 1; j <= 200; ++j) /*wyswietla 200 razy */ printf( proces macierzysty %d\n,j); /* napis */ 41
blokada sygnału przerwania dla procesu potomnego wykonanie tego programu i wcinicie Del podczas wywietlania wyników na ekranie powoduje, e otrzymujemy: proces macierzysty 190 proces macierzysty 191 prproces potomny 86 proces potomny 87... proces potomny 99 proces potomny 100 $ 42
blokada sygnału przerwania dla procesu potomnego widoczne jest, e przerwanie programu klawiszem Del ma tylko wpływ na proces macierzysty, proces potomny jest wykonywany bez przeszkód 43
przywrócenie sygnałowi akcji domylnej realizowane jest za pomoc funkcji: signal(sigtype, SIG_DFL) sigtype jest literałem definiujcym sygnał, który chcemy przywróci funkcj t mona stosowa do przywrócenia sygnału po tym, jak został on czasowo zakazany, aby nie przerywał operacji w sekcji krytycznej 44
przywrócenie sygnałowi akcji domylnej w przykładzie tym sygnał przerwania jest ignorowany w czasie wczytywania BUF bajtów z tablicy rekord do pliku podanego w fp po wykonaniu programu w pliku plik pojawi si napis Test, operacja ta nie jest przerywana 45
przywrócenie sygnałowi akcji #include <stdio.h> #include <signal.h> domylnej #define BUF 5 /* BUF liczba przeczytanych znakow */ main() /* signal5.c, przywrocenie sygnalowi */ /* akcji domyslnej */ { FILE *fp; /* deklaracja deskryptora pliku */ char *rekord; /* wskaznik do tekstu */ rekord = Test ; /* przypisanie zmiennej rekord */ /* wskazania na tekst */ /* poczatek sekcji krytycznej */ 46
przywrócenie sygnałowi akcji domylnej signal(sigint, SIG_IGN); /* blokada sygnalu */ /* przerwania */ fp = fopen( /staff/sajkowsk/plik, w ); /* utworzenie pliku z prawem pisania do niego */ fwrite(rekord, 1, BUF, fp); /* zapis BUF bajtow */ /* z tablicy rekord do pliku podanego w fp */ signal(sigint, SIG_DFL); /* przywrocenie sygnalowi */ /* akcji domyslnej */ /* koniec sekcji krytycznej */ fclose(fp); /* zamkniecie otartego pliku */ } 47
przechwycenie sygnału i okrelenie akcji własnej jest wykonywane za pomoc funkcji systemowej: signal(sigtype, newptr) gdzie sigtype jest literałem przechwytywanego sygnału, a newptr wskanikiem funkcji definiujcej now akcj 48
przechwycenie sygnału i okrelenie akcji własnej program moe zredefiniowa akcj sygnału w dowolnym czasie std wiele programów definiuje róne akcje dla rónych warunków akcja sygnału przerwania moe zalee od wartoci zwracanej przez zdefiniowan funkcj pokazuje to kolejny przykład 49
przechwycenie sygnału i okrelenie akcji własnej #include <stdio.h> #include <signal.h> main() /*signal7.c, zlapanie sygnalu */ { int przechwyc(), i = 100; /* deklaracja wartosci */ /* funkcji */ /* deklaracja zmiennej i ustalenie jej */ /* wartosci poczatkowej */ printf( nacisnij klawisz przerwania by zatrzymac\n ); /* wyswietlenie napisu */ signal(sigint, przechwyc); /* wywolanie funkcji */ /* definiujacej nowa akcje */ 50
przechwycenie sygnału i okrelenie akcji własnej while(i > 0) /* dopoki spelniony warunek */ { printf( program si wykonuje %d\n, i); i--; /* wyswietlaj napis */ } /* zmniejsz o jeden */ } przechwyc() /* funkcja definiuje nowa akcje podjeta */ { /* po wystapieniu sygnalu */ printf( program si zakonczyl\n ); /* napis */ exit(1); /* zakonczenie procesu */ } 51
przechwycenie sygnału i okrelenie akcji własnej po wykonaniu prgramu i naciniciu klawisza Del, otrzymujemy: nacisnij klawisz przerwania aby si zatrzymac program si wykonuje 100 program si wykonuje 91 program si wykonprogram si zakonczyl przerwanie programu prowadzi do podjcia akcji własnej, napisu program si zakonczyl, i wtedy proces si koczy 52
przywrócenie sygnałowi poprzedniej akcji warto zwracana przez funkcj signal moe by zachowana, a nastpnie wykorzystana w kolejnym jej wywołaniu, w celu przywrócenia sygnałowi jego poprzedniej akcji 53
przywrócenie sygnałowi poprzedniej akcji wywołanie funkcji ma wtedy posta: signal(sigtype, oldptr) gdzie sigtype jest literałem okrelajcym, który sygnał ma by przywrócony, a oldptr wartoci wskanika, zwracan przez poprzednie wykonanie funkcji signal 54
opónienie akcji sygnału jest realizowane przez przechwycenie sygnału i okrelenie dla niego nowej akcji, polegajcej na ustawieniu globalnie zdefiniowanej flagi program kontynuuje swoje działania a do momentu testowania flagi, test ten polega na sprawdzeniu, czy sygnał został odebrany jeeli tak, to jest on obsługiwany 55
opónienie akcji sygnału przed obsług opónionego sygnału naley zablokowa sygnał przerwania, aby ochroni flag przed zmian w czasie jej testowania bezporednio po wykonaniu nowej akcji dla sygnału system automatycznie ustawia sygnał na jego akcj domyln dlatego naley pamita o ponownym definiowaniu sygnału po kadym przerwaniu 56
opónienie akcji sygnału #include <stdio.h> #include <signal.h> int sigflag /* deklaracja zmiennej calkowitej */ main() /*signal10.c, opoznienie akcji sygnalu */ { int delay(), i; /* deklaracje wartosci funkcji */ int (*savesig)() /* i zmiennych */ extern int sigflag; printf( flaga = %x\n, sigflag); /* napis */ signal(sigint, delay); /* opoznij sygnal */ printf( flaga sygnalu po opoznieniu = %x\n, sigflag); 57
opónienie akcji sygnału for(i = 1; i <= 200; ++i) /* wyswietlenie napisu */ /* 200 razy */ printf( program wykonuje nieprzerywalna akcje\n ); savesig = signal(sigint, SIG_IGN); /* zakaz sygnalu */ printf( flaga sygnalu po zakazie = %x\n, sigflag); /* wyswietlenie napisu */ if (sigflag) /* jeeli warunek spelniony */ /* to wyswietlenie napisu */ printf( flaga sygnalu = %x\n, signal); /* obsluga opoznionego sygnalu */ } 58
opónienie akcji sygnału delay() /* nowa akcja podjeta przez sygnal */ { extern int sigflag; /* zmienna zewnetrzna */ sigflag = 1; /* ustawienie flagi */ } 59
opónienie akcji sygnału gdy nie ingerujemy w działanie programu, mamy wynik: flaga = 0 flaga sygnalu po opoznieniu = 0 program wykonuje nieprzerywalna akcje flaga sygnalu po zakazie = 0 60
opónienie akcji sygnału gdy naciniemy klawisz przerwania Del, mamy wynik: flaga = 0 program wykonuje nieprzerywalna akcje program wykprogram wykonuje nieprzerywalna akcje program wykonuje nieprzerywalna akcje flaga sygnalu po zakazie = 1 flaga sygnalu = 1 61
opónienie akcji sygnału gdy dwukrotnie naciniemy klawisz przerwania Del, mamy wynik: flaga sygnalu = 0 flaga sygnalu po opoznieniu = 0 program wykonuje nieprzerywalna akcje program wykprogram wykonuje nieprzerywalna akcje program wykonuje nieprzerywalna akcje program wykonuje nieprzerywalna akcje 62
opónienie akcji sygnału zauwamy, e: w przypadku jednokrotnego nacinicia klawisza Del program wykonuje z opónieniem obsług sygnału SIGINT, co wskazuje napis flaga sygnalu = 1 przy dwukrotnym naciniciu klawisza Del nastpuje akcja domylna dla sygnału SIGINT i program jest przerywany 63
opónienie akcji sygnału zauwamy dalej, e: gdy nie ingerujemy w wykonanie programu, pojawia si napis flaga sygnalu po zakazie = 0, wiadczca o tym fakcie 64
wnioski przestawiono drug cz zarzdzania procesami, powicon sygnałom i ich wykorzystaniu zagadnienia dotyczce zarzdzania pamici operacyjn, urzdzeniami wejcia/wyjcia i plikami bd przedmiotem kolejnego szkolenia 65
bibliografia [KS1993] Z. Królikowski, M. Sajkowski, System operacyjny UNIX dla pocztkujcych i zaawansowanych, Nakom, Pozna 1993. [Sobaniec2002] C. Sobaniec, System operacyjny Linux przewodnik uytkownika, Nakom, Pozna 2002. 66