Unix: programowanie procesów

Podobne dokumenty
Unix: programowanie procesów

Unix: programowanie procesów

Unix: programowanie procesów

Procesy. w systemach operacyjnych (quasi)równoleg le wykonywanie wielu być wykonywane naprzemiennie i/lub jednocześnie.

przerwany proces móg l zareagować na określone zdarzenie. Można je traktować jako software owe wersje przerwań sprz etowych.

Środowisko procesu Unixowego

Sygnały. 7. Sygnały (2005/2006)

Programowanie Współbieżne. W Linuxie/Unixie

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Funkcje systemu Unix

Procesy. w systemach operacyjnych (quasi)równoleg le wykonywanie wielu być wykonywane naprzemiennie i/lub jednocześnie.

Procesy. w systemach operacyjnych (quasi)równoleg le wykonywanie wielu być wykonywane naprzemiennie i/lub jednocześnie.

Procesy. w systemach operacyjnych (quasi)równoleg le wykonywanie wielu być wykonywane naprzemiennie i/lub jednocześnie.

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Systemy Operacyjne Ćwiczenia

przypadków wywo lanie systemowe (funkcja systemowa) lub funkcja biblioteczna zwraca wartość 1(czasamiNULL) iprzypisujezmiennej zewn etrznej,

Procesy, pliki, potoki, sygnały - uzupełnienie

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)

Obsługa sygnałów. Tomasz Borzyszkowski

4.2 Sposób korzystania z l acza

Model procesu w systemie Linux. Tomasz Borzyszkowski

pami eć operacyjna przechowuje dane do przetworzenia, tymczasowe dane pomocnicze,

procesy odrębne dzielone

Temat zajęć: Obsługa procesów w systemie.

1. Timery i zdarzenia

2. Zarządzanie procesami

Laboratorium Procesy w systemach UNIX 3.2 Polecenia związane z procesami

Sygnał mechanizm asynchronicznego powiadamiania procesów o zdarzeniach zwykle awaryjnych.

Zaawansowane programowanie w C++

Systemy Operacyjne 1 Laboratorium 2 Procesy i sygnały w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot

Procesy w systemach UNIX i Linux

procesami w systemie Unix

UNIX. mgr inż. Marcin Borkowski

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

2. Zarządzanie procesami

Sygnały i ich obsługa

Wprowadzenie do systemu operacyjnego Linux zarzdzanie procesami, cz. 2

Zarządzanie procesami

procesami w systemie Unix

procesami w systemie Unix

Systemy Operacyjne I: Procesy

Linux: Procesy. Systemy Operacyjne. Mateusz Hołenko. 26 marca 2013

Obsługa plików Procesy

Laboratorium systemów operacyjnych ćwiczenie nr 3. [ilość modułów: 1] Temat zajęć: Procesy w systemie operacyjnym

Mechanizmy komunikacji i synchronizacji

Procesy. S. Samolej: Procesy

Systemy Operacyjne - Operacje na plikach

2. Zarządzanie procesami

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

aodczytywać zniegoza pomoc afunkcjiread, (niebuforowane funkcje wejścia/wyjścia). e sukcesem, to zwróci liczb, erzeczywiściezapisanychbajtów.

Krótki kurs programowania współbieżnego

POSIX: IEEE Std (Issue 6, 2004 edition)

Paradygmaty programowania. Paradygmaty programowania

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Dariusz Wawrzyniak 5 kwietnia 2001

jeszcze dygresja o macierzach...

Uruchamianie programów w systemie Linux, potoki, strumienie, procesy, alias

Pobieranie argumentów wiersza polecenia

Łącza nienazwane(potoki)

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

4. Procesy pojęcia podstawowe

... Ireneusz Mrozek. Wydział Informatyki

SYSTEM DIAGNOSTYCZNY OPARTY NA LOGICE DOMNIEMAŃ. Ewa Madalińska. na podstawie prac:

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

sposób wykonywania operacji zapisu i odczytu dane odczytywane z l acza usuwane (nie można ich odczytać ponownie),

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Programowanie Proceduralne

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Unix: programowanie z użyciem w atków

Unix: programowanie z użyciem w atków

4. Procesy pojęcia podstawowe

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawowe zasady bezpieczeństwa

Krótkie wprowadzenie do korzystania z OpenSSL

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Gniazda BSD. komunikacja bezpołączeniowa

Procesy. 5. Procesy (2005/2006)

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Operacje wejścia/wyjścia (odsłona druga) - pliki

eć dzielona standardu POSIX

1 Podstawy c++ w pigułce.

Pliki, potoki, sygnały

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Rozdzia l 3. Laboratorium 3. danych zawierajac

1.1 Definicja procesu

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Uruchamianie SNNS. Po uruchomieniu. xgui & lub snns & pojawia si e okno. programu. Symulator sztucznych sieci neuronowych SNNS 1

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Zarządzanie Procesami

Watki. kod programu za ladowany do pami eci operacyjnej, wraz ze środowiskiem (zbiorem

Jądro Powłoka System plików Programy użytkowe

Wstęp do programowania

Transkrypt:

Unix: programowanie procesów Witold Paluszyński witold.paluszynski@pwr.wroc.pl http://sequoia.ict.pwr.wroc.pl/ witold/ Copyright c 1999 2013 Witold Paluszyński All rights reserved. Niniejszy dokument zawiera materia ly do wyk ladu na temat programowania procesów w systemie Unix. Jest on udost epniony pod warunkiem wykorzystania wy lacznie do w lasnych, prywatnych potrzeb i może być kopiowany wy lacznie w ca lości, razem z niniejsza strona tytu low a.

Środowisko procesu unixowego Proces unixowy: kod programu w pami eci (obszar programu i danych) środowisko (zestaw zmiennych i przypisanych im wartości) zestaw dalszych informacji utrzymywanych przez jadro Unixa o wszystkich istniejacych procesach, m.in. tablic e otwartych plików, mask e sygna lów, priorytet, i in. Funkcja main() wywo lywana przez procedur e startowa z nast epuj acymi argumentami: liczba argumentów wywo lania: int argc wektorem argumentów wywo lania: char *argv[] środowiskiem: char **environ rzadko używanym ponieważ dost ep do środowiska możliwy jest również poprzez funkcje: getenv()/putenv() Proces charakteryzuja: pid, ppid, pgrp, uid, euid, gid, egid. Wartości te można uzyskać funkcjami get...() Unix: programowanie procesów 3

Tworzenie procesów Procesy tworzone sa przez klonowanie istniejacego procesu funkcja fork(), zatem każdy proces jest podprocesem (child process) jakiegoś procesu nadrz ednego, albo inaczej rodzicielskiego (parent process). Jedynym wyjatkiem jest proces numer 1 init tworzony przez jadro Unixa w chwili startu systemu. Wszystkie inne procesy w systemie sa bliższymi lub dalszymi potomkami inita. Podproces dziedziczy i/lub wspó ldzieli pewne atrybuty i zasoby procesu nadrz ednego, a gdy kończy prac e, Unix zatrzymuje go do czasu odebrania przez proces nadrz edny statusu podprocesu (wartości zakończenia). Unix: programowanie procesów 4

Kończenie pracy procesów Zakończenie procesu unixowego może być normalne, wywo lane przez zakończenie funkcji main(), lub funkcj e exit(). Wtedy: nast epuje wywo lanie wszystkich handlerów zarejestrowanych przez funkcj e atexit(), nast epuje zakończenie wszystkich operacji wejścia/wyjścia procesu i zamkni ecie otwartych plików, można spowodować normalne zakończenie procesu bez kończenia operacji wejścia/wyjścia ani wywo lywania handlerów atexit, przez wywo lanie funkcji _exit(). Zakończenie procesu może być anormalne (ang. abnormal), przez wywo lanie funkcji abort, lub otrzymanie sygna lu (funkcje kill(), raise()). Unix: programowanie procesów 5

Status procesu W chwili zakończenia pracy proces generuje kod zakończenia, tzw. status, który jest wartościa zwrócona z funkcji main() albo exit(). W przypadku śmierci z powodu otrzymania sygna lu kodem zakończenia jest wartość 128+nr sygna lu. Rodzic normalnie powinien po śmierci potomka odczytać jego kod zakończenia wywo luj ac funkcj e systemowa wait() (lub waitpid()). Aby to u latwić (w nowszych systemach) w chwili śmierci potomka jego rodzic otrzymuje sygna l SIGCLD (domyślnie ignorowany). Gdy proces nadrz edny żyje w chwili zakończenia pracy potomka, i nie wywo luje funkcji wait(), to potomek pozostaje (na czas nieograniczony) w stanie zwanym zombie. Może to być przyczyna wyczerpania jakichś zasobów systemu, np. zape lnienia tablicy procesów, otwartych plików, itp. Istnieje mechanizm adopcji polegajacy na tym, że procesy, których rodzic zgina l przed nimi (sieroty), zostaja adoptowane przez proces numer 1, init. Init jest dobrym rodzicem (chociaż przybranym) i wywo luje okresowo funkcj e wait() aby umożliwić poprawne zakończenie swoich potomków. Unix: programowanie procesów 6

Grupy procesów Grupa procesów: wszystkie podprocesy uruchomione przez jeden proces nadrz edny. Każdy proces w chwili utworzenia automatycznie należy do grupy procesów swojego rodzica. Pod pewnymi wzgl edami przynależność do grupy procesów jest podobna do przynależności do partii politycznych. Każdy proces może: za lożyć nowa grup e procesów (o numerze równym swojemu PID), wstapić do dowolnej innej grupy procesów, w l aczyć dowolny ze swoich podprocesów do dowolnej grupy procesów (ale tylko dopóki podproces wykonuje kod rodzica). Grupy procesów maja g lównie znaczenie przy wysy laniu sygna lów. Unix: programowanie procesów 7

Zasoby procesu Ograniczenia zasobów procesu: getrlimit/setrlimit: RLIMIT_CORE, RLIMIT_CPU, RLIMIT_DATA, RLIMIT_FSIZE, RLIMIT_NOFILE, i inne, zależnie od systemu Unix: programowanie procesów 8

Sesja i terminal Sesj e stanowi zbiór grup procesów o wspólnym numerze sesji. Zwykle potoki poleceń uruchamiane w interpreterze poleceń stanowia oddzielne grupy procesów, lecz wszystkie należa do jednej sesji (interpretera poleceń). Sesja może posiadać tzw. terminal sterujacy. Wtedy w sesji istnieje jedna grupa procesów pierwszoplanowych (foreground) i dowolna liczba grup procesów drugoplanowych, czyli pracujacych w tle (background). Procesy z grupy pierwszoplanowej otrzymuja sygna ly i dane z terminala. Poj ecie terminala pochodzi od ekranowych terminali alfanumerycznych s lużacych użytkownikom do laczenia si e z komputerem. Przy po laczeniach przez sieć, lub z systemu okienkowego Unix stosuje poj ecie pseudo-terminala stanowiacego urzadzenie komunikacyjne sk ladajace si e z dwóch cz eści: cz eści użytkownika do której po laczenie sieciowe wysy la dane użytkownika, i cz eści programowej, która widzi program na zdalnym komputerze, np. interpreter poleceń. Moga istnieć procesy nie posiadajace terminala sterujacego. Cz esto przydatne jest by procesy pracujace ciagle w tle nie mia ly terminala sterujacego. Takie procesy nazywamy demonami (ang. daemon). Unix: programowanie procesów 9

Stany procesów wykonywalny (runnable) proces w kolejce procesów gotowych do wykonania uśpiony (sleeping) proces czeka na coś (np. na dane do przeczytania, na sygna l, na dost ep do zasobu, lub dobrowolnie śpi na określony okres) zatrzymany (stopped) proces gotowy do wykonywania lecz zatrzymany na skutek otrzymania sygna lu SIGSTOP lub SIGTSTP, może to być skutkiem dobrowolnego żadania procesu, celowego wys lania sygna lu (np. przez użytkownika), lub odwo lania si e procesu pracujacego w tle do terminala sterujacego; wznowienie pracy procesu nast epuje po otrzymaniu sygna lu SIGCONT wymieciony (swapped out) proces usuni ety okresowo z kolejki procesów gotowych do wykonywania wskutek dzia lania algorytmu obs lugi pami eci wirtualnej; stan wymiecenia nie jest w laściwym stanem procesu może on być w jednym z trzech poprzednich stanów; wymiecenie procesu wykonywalnego oznacza brak dostatecznej ilości pami eci fizycznej na jednoczesne skuteczne wykonywanie wszystkich procesów wykonywalnych zombie proces czeka na zakończenie Unix: programowanie procesów 10

Tworzenie procesów funkcja system #include <stdlib.h> #include <stdio.h> int main() { char komenda[bufsiz]; sprintf(komenda, "ps -fu %s", getenv("logname")); system(komenda); return(0); Funkcja system powoduje wykonanie polecenia w podprocesie. Polecenie jest interpretowane i wykonywane przez interpreter poleceń, i może wykorzystywać wszystkie mechanizmy: skierowania, potoki, itd. Podproces wspó ldzieli z procesem wywo luj acym dost ep do plików, w tym do terminala (stdin, stdout, stderr). W czasie wykonywania podprocesu proces wywo luj acy czeka. Funkcja system zwraca wartość statusu zwrócona przez interpreter poleceń, która zwykle jest statusem wykonanego polecenia. Unix: programowanie procesów 11

#include <stdlib.h> #include <stdio.h> Tworzenie procesów funkcja popen int main() { FILE *proc_fp; char komenda[bufsiz], bufor[bufsiz]; sprintf(komenda, "ps -fu %s", getenv("logname")); proc_fp = popen(komenda, "r"); while (fgets(bufor, BUFSIZ, proc_fp)!= NULL) fputs(bufor, stdout); return(pclose(proc_fp)); Funkcja popen powoduje wykonanie w podprocesie polecenia interpretowanego przez interpreter poleceń, podobnie jak system. Funkcja popen tworzy jednokierunkowy potok komunikacyjny skierowany od podprocesu do procesu wywo luj acego (argument "r"), lub od procesu wywo luj acego do podprocesu (argument "w"). Proces wywo luj acy posiada dodatkowy dost ep do potoku, gdy podproces ma potok przypisany jako swój plik stdout, lub stdin, odpowiednio. Proces wywo luj acy nie czeka tutaj na zakończenie podprocesu, tylko oba procesy pracuja równolegle. Unix: programowanie procesów 12

Tworzenie procesów funkcja fork switch (pid = fork()) { case -1: fprintf(stderr, "Blad, nieudane fork, errno=%d\n", errno); exit(-1); case 0: /* jestem potomkiem, no to znikam... */ execlp("program", "program", NULL); fprintf(stderr, "Blad, nieudane execlp, errno=%d\n", errno); exit(0); default: /* jestem szczesliwym rodzicem... */ fprintf(stderr, "Sukces fork, pid potomka = %d\n", pid); Funkcja fork tworzy podproces, który jest kopia procesu macierzystego. Po sklonowaniu si e podproces może wywo lać jedna z funkcji grupy exec i rozpoczać w ten sposób wykonywanie innego programu. W tym przypadku nie ma polecenia do wykonania, ani interpretera poleceń; jest tylko program i jego wektor argumentów. Po sklonowaniu si e oba procesy wspó ldziela dost ep do plików otwartych przed sklonowaniem. Funkcja fork jest podstawowa (i jedyna) metoda tworzenia procesów. Unix: programowanie procesów 13

Unix: programowanie procesów 14

Dziedziczone (podproces posiada kopi e atrybutu procesu): real i effective UID i GID, proces group ID (PGRP) kartoteka bieżaca i root środowisko maska tworzenia plików (umask) maska sygna lów i handlery ograniczenia zasobów W lasności procesu i podprocesu Różne: PID, PPID wartość zwracana z funkcji fork blokady plików nie sa dziedziczone ustawiony alarm procesu nadrz ednego jest kasowany dla podprocesu zbiór wys lanych (ale nieodebranych) sygna lów jest kasowany dla podprocesu Atrybuty procesu, które nie zmieniaja si e po exec: Wspólne (podproces wspó ldzieli atrybut/zasób z procesem): terminal i sesja otwarte pliki (deskryptory) otwarte wspólne obszary pami eci PID, PPID, UID(real), GID(real), PGID terminal, sesja ustawiony alarm z biegnacym czasem kartoteka bieżaca i root maska tworzenia plików (umask) maska sygna lów i oczekujace (nieodebrane) sygna ly blokady plików ograniczenia zasobów Unix: programowanie procesów 15

Unix: programowanie procesów 16

Sygna ly Sygna ly sa mechanizmem asynchronicznego powiadamiania procesów o zdarzeniach. Zosta ly poczatkowo przystosowane do powiadamiania o b l edach, ale nast epnie rozszerzone do obs lugi wielu innych zdarzeń. Zdarzenia generujace sygna ly: b l edy i wyjatki sprz etowe: nielegalna instrukcja, nielegalne odwo lanie do pami eci, dzielenie przez 0, itp. (SIGILL, SIGSEGV, SIGFPE) naciskanie pewnych klawiszy na terminalu użytkownika (SIGINT, SIGQUIT) wywo lanie komendy kill przez użytkownika (SIGTERM, i inne) funkcja kill mechanizmy software-owe (SIGALRM) Reakcja procesu na sygna l może być: ignorowanie, wywo lanie wybranej funkcji obs lugi (handlera), lub natychmiastowe zakończenie (śmierć) procesu. Unix: programowanie procesów 17

nr nazwa domyślnie zdarzenie 1 SIGHUP śmierć roz laczenie terminala sterujacego 2 SIGINT śmierć przerwanie z klawiatury (zwykle: Ctrl-C) 3 SIGQUIT zrzut przerwanie z klawiatury (zwykle: Ctrl-\) 4 SIGILL zrzut nielegalna instrukcja 5 SIGTRAP zrzut zatrzymanie w punkcie kontrolnym (breakpoint) 6 SIGABRT zrzut sygna l generowany przez funkcj e abort 8 SIGFPE zrzut nadmiar zmiennoprzecinkowy 9 SIGKILL śmierć bezwarunkowe uśmiercenie procesu 10 SIGBUS zrzut b lad dost epu do pami eci 11 SIGSEGV zrzut niepoprawne odwo lanie do pami eci 12 SIGSYS zrzut b l ad wywo lania funkcji systemowej 13 SIGPIPE śmierć b l ad potoku: zapis do potoku bez odbiorcy 14 SIGALRM śmierć sygna l budzika (timera) 15 SIGTERM śmierć zakończenie procesu 16 SIGUSR1 śmierć sygna l użytkownika 17 SIGUSR2 śmierć sygna l użytkownika 18 SIGCHLD ignorowany zmiana stanu podprocesu (zatrzymany lub zakończony) 19 SIGPWR ignorowany przerwane zasilanie lub restart 20 SIGWINCH ignorowany zmiana rozmiaru okna 21 SIGURG ignorowany priorytetowe zdarzenie na gniazdku 22 SIGPOLL śmierć zdarzenie dotyczace deskryptora pliku 23 SIGSTOP zatrzymanie zatrzymanie procesu 24 SIGTSTP zatrzymanie zatrzymanie procesu przy dost epie do terminala 25 SIGCONT ignorowany kontynuacja procesu 26 SIGTTIN zatrzymanie zatrzymanie na próbie odczytu z terminala 27 SIGTTOU zatrzymanie zatrzymanie na próbie zapisu na terminalu 30 SIGXCPU zrzut przekroczenie limitu CPU 31 SIGXFSZ zrzut przekroczenie limitu rozmiaru pliku Unix: programowanie procesów 18

Sygna ly funkcje obs lugi (tradycyjne) Istnieje kilka różnych modeli generowania i obs lugi sygna lów. Jednym z nich jest tzw. model tradycyjny, pochodzacy z wczesnych wersji Unixa. Jego cecha charakterystyczna jest, że zadeklarowanie innej niż domyślna obs lugi sygna lu ma charakter jednorazowy, tj., po otrzymaniu pierwszego sygna lu przywracana jest reakcja domyślna. Funkcje tradycyjnego modelu obs lugi sygna low: signal deklaruje jednorazowa reakcj e na sygna l: ignorowanie (SIG_IGN), obs luga, oraz reakcja domyślna (SIG_DFL) kill wysy la sygna l do innego procesu raise wysy la sygna l do w lasnego procesu pause czeka na sygna l alarm uruchamia budzik, który przyśle sygna l SIGALRM Unix: programowanie procesów 19

Handlery sygna lów #include <signal.h> #include <stdio.h> #include <unistd.h> void ouch(int sig) { printf("ouch! - I got signal %d\n", sig); int main() { (void) signal(sigint, ouch); while(1) { printf("hello World!\n"); sleep(1); Zwróćmy uwag e: deklaracja handlera: funkcja typu void z pojedynczym argumentem int powrót z handlera wznowienie pracy programu Unix: programowanie procesów 20

Handlery sygna lów (cd.) void handler(int sygnal) { signal(sygnal, SIGN_IGN); /* wlasciwe akcje handlera, np: */ unlink(tmp_file); exit(1); int main() { if (signal(sigint, SIGN_IGN)!= SIG_IGN) signal(sigint, handler);... sprawdzenie w programie, czy dyspozycja sygna lu nie jest ignorowanie obs luga takich sygna lów nie powinna być zmieniana ignorowanie sygna lu na wejściu do handlera zakończenie pracy handlera: koniec procesu kontynuacja kontynuacja z przekazaniem informacji kontynuacja od określonego punktu ponowne uzbrojenie handlera w przypadku kontynuacji Unix: programowanie procesów 21

Obs luga sygna lów inne modele Tradycyjny model generowania i obs lugi sygna lów jest uproszczony i nieco niewygodny (okno czasowe w czasie którego brak jest zadeklarowanego handlera). Dlatego powsta ly alternatywne modele funkcjonowania sygna lów. Niestety, sa one wzajemnie niekompatybilne. Model BSD nie zmienia deklaracji handlera po otrzymaniu sygna lu, natomiast w trakcie wykonywania handlera kolejne sygna ly tego samego typu sa automatycznie blokowane. Deklaracji handlera w tym modelu dokonuje si e funkcja sigvec. Niezawodny model Systemu V ma podobne w lasności do modelu BSD, tzn. również pozwala na trwa la deklaracj e handlera. Wprowadza wi ecej funkcji i opcji obs lugi sygna lów. Do deklaracji handlera w tym modelu s luży funkcja sigset. Pomimo iż powyższe modele istnieja w wielu systemach uniksowych, ich stosowanie nie ma sensu w programach, które maja być przenośne. Unix: programowanie procesów 22

Handlery sygna lów alarm #include <signal.h> #include <setjmp.h> jmp_buf stan_pocz; int obudzony = 0; void obudz_sie(int syg) { signal(syg, SIG_HOLD); fprintf(stderr, "Przerwane sygnalem %d\n", syg; obudzony = 1; longjmp(stan_pocz, syg); int main() { int syg;... syg = setjmp(stan_pocz); /* np.poczatek petli */ signal(sigterm, obudz_sie); signal(sigint, obudz_sie); signal(sigalrm, obudz_sie); if (obudzony == 0) { alarm(30); /* limit 30 sekund */ Unix: programowanie procesów 23

DlugieObliczenia(); alarm(0); /* zdazylismy */ else printf("program wznowiony po przerwaniu sygnalem %d\n", syg); Unix: programowanie procesów 24

Obs luga sygna lów model POSIX Standard POSIX zdefiniowa l nowy model generowania sygna lów i zestaw funkcji oferujacy możliwość kompleksowego i bardziej elastycznego deklarowania ich obs lugi: funkcja sigaction() deklaruje reakcj e na sygna l (trwale) automatyczne blokowanie na czas obs lugi obs lugiwanego sygna lu i dowolnego zbioru innych sygna lów dodatkowe opcje obs lugi sygna lów, np. handler sygna lu może otrzymać dodatkowe argumenty: struktur e informujac a o okolicznościach wys lania sygna lu i druga struktur e informujac a o kontekście przez odebraniem sygna lu rozszerzony prototyp handlera: void handler(int sig, siginfo_t *sip, ucontext_t *uap); sigprocmask()/sigfillset()/sigaddset() operacje na zbiorach sygna lów Unix: programowanie procesów 25

#include <signal.h> #include <stdio.h> #include <unistd.h> void joj(int sig, siginfo_t *sip, ucontext_t *uap) { printf("dostalem signal numer %d\n", sig); if (sip->si_code <= 0) printf("od procesu %d\n", sip->si_pid); printf("kod sygnalu %d\n", sip->si_code); void main() { struct sigaction act; act.sa_handler = joj; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO; sigaction(sigint, &act, 0); while(1) { printf("hello World!\n"); sleep(1); Unix: programowanie procesów 26

#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/un.h> #include <sys/wait.h> #include <sys/socket.h> Przyk lad: serwer wieloprocesowy #define GNIAZDKO_SERWERA "/tmp/gniazdko_serwera" void obsluz_klienta(int sock); int main() { int serv_sock, cli_sock; int addr_len; struct sockaddr_un addr_str; serv_sock = socket(pf_unix, SOCK_STREAM, 0); addr_str.sun_family = AF_UNIX; strcpy(addr_str.sun_path, GNIAZDKO_SERWERA); addr_len = sizeof(addr_str); unlink(gniazdko_serwera); /* nie moze istniec */ bind(serv_sock,(struct sockaddr *)&addr_str,addr_len);/*rejestracja*/ listen(serv_sock, 5); /* kolejkowanie polaczen */ Unix: programowanie procesów 27

while (1) { printf("rodzic pid=%d, czekam na polaczenie\n", (int)getpid()); cli_sock = accept(serv_sock,0,0); /* polacz.zamiast adr.klienta*/ if (fork() == 0) { /* jestem potomkiem */ close(serv_sock); /* gniazdko niepotrzebne */ serve_client(cli_sock); /* gniazdko obslugi klienta */ return 0; /* skonczylem prace */ /* jestem rodzicem, odpowiadam tylko za odbieranie polaczen */ close(cli_sock); /* gniazdko niepotrzebne */ waitpid((pid_t)-1,(int *)0,WNOHANG);/* obowiazki rodzicielskie */ /* opoznienie sleep niepotrzebne, bede czekal w funkcji accept */ Unix: programowanie procesów 28

Czyszczenie podprocesów: ci ag dalszy W serwerach pracujacych i tworzacych podprocesy w sposób ciag ly istotnym staje si e problem zczytywania statusu kończacych prac e potomków. Możliwe rozwiazania tego problemu: Wywo lywanie funkcji wait natychmiast po utworzeniu podprocesu: while (1) { int status; cli_sock = accept(serv_sock,0,0); if (fork() == 0) { /* jestem potomkiem */ close(serv_sock); /* gniazdko niepotrzebne */ serve_client(cli_sock); /* gniazdko obslugi klienta */ return 0; /* skonczylem prace */ close(cli_sock); /* jestem rodzicem */ wait(&status); /* obowiazki rodzicielskie */ Ten sposób jest poprawny z punktu widzenia obs lugi potomków, jednak tak napisany program nie b edzie w żadnym stopniu wspó lbieżny. Unix: programowanie procesów 29

Okresowe wywo lywanie jednej z pozosta lych funkcji z grupy wait* (waitpid, waitid, wait3, wait4,...) z flaga WNOHANG, zapobiegajac a oczekiwaniu na zakończenie podprocesu: while (1) { cli_sock = accept(serv_sock,0,0); if (fork() == 0) { /* jestem potomkiem */ close(serv_sock); /* gniazdko niepotrzebne */ serve_client(cli_sock); /* gniazdko obslugi klienta */ return 0; /* skonczylem prace */ close(cli_sock); /* jestem rodzicem */ while (waitpid((pid_t)-1,(int *)0,WNOHANG)>0) /* obowiazki */ ; /* rodzicielskie */ Ten sposób pozwala zachować wspó lbieżność i b edzie skutecznie likwidować zombie o ile takie wywo lania funkcji wait* b ed a wystarczajaco cz este, i nie b edzie nadmiernych opóźnień. (Zauważmy, że w tym przypadku funkcja waitpid ani nie pobiera statusu potomka, ani nie oczekuje jego zakończenia, ale jest potrzebna dla poprawnej obs lugi protoko lu zakończenia podprocesu.) Unix: programowanie procesów 30

Zadeklarowanie handlera sygna lu SIGCHLD (lub SIGCLD) funkcja signal lub sigset i wywo lywanie w nim funkcji wait wtedy mamy pewność, że istnieje potomek w stanie zombie i funkcja wait wróci natychmiast: void child_wait(int sig) { int child_status; signal(sigcld, child_wait); wait(&child_status); /* main() */ signal(sigchld, child_wait); while (1) { cli_sock = accept(serv_sock,0,0); if (fork() == 0) { /* jestem potomkiem */ close(serv_sock); serve_client(cli_sock); return 0; close(cli_sock); /* jestem rodzicem */ Uwaga: jeśli zadeklarujemy handler funkcja sigaction to sygna l b edzie generowany nie tylko przy śmierci potomka, ale również przy jego zastopowaniu i wznowieniu. Temu z kolei można zapobiec ustawiajac flag e SA_NOCLDSTOP w strukturze sigaction. Unix: programowanie procesów 31

Ustawienie flagi SA_NOCLDWAIT w strukturze sigaction przy deklarowaniu obs lugi sygna lu SIGCHLD (co wi ecej, w tym przypadku sygna l może być po prostu ignorowany) powoduje to nietworzenie procesów zombie przy śmierci potomków, i ca lkowity brak konieczności wywo lywania funkcji wait: struct sigaction sa; sa.sa_handler = SIG_IGN; #ifdef SA_NOCLDWAIT sa.sa_flags = SA_NOCLDWAIT; #else sa.sa_flags = 0; #endif sigemptyset(&sa.sa_mask); sigaction(sigchld, &sa, NULL); Ten sposób wydaje si e prosty i skuteczny, jednak nie wszystkie systemy uniksowe posiadaja ten mechanizm. Unix: programowanie procesów 32