c Wies law P laczek 3 1 Obs luga b l edów Wwi ekszości przypadków wywo lanie systemowe (funkcja systemowa) lub funkcja biblioteczna kończ ac si e b l edem zwraca 1(czasamiNULL) iprzypisujezmiennej zewn etrznej errno wskazuj ac arodzajb l edu. Informacje o kodach b l edów oraz odpowiadajacych im komunikatach można znaleźć w man errno. Funkcja biblioteczna perror <stdio.h> Prototyp void perror(const char *s); Funkcja perror wypisuje komunikat b l edu poprzedzony napisem *s iznakiem :.! UWAGA: Pliki nag lówkowe podaje si ewzgl edem katalogu /usr/include/. 2 Procesy PROGRAM: aktywny statyczny zbiór z lożonych w odpowiedniej kolejności instrukcji oraz towarzysz acych im danych. PROCES: Podstawowe poj ecie w Uniksie. Abstrakcyjny twór sk ladaj acy si ezwykonywanego(dzia laj acego) programu oraz bież acych danych o jego stanie i zasobach za pomoc aktórychsystemoperacyjny steruje jego wykonywaniem. Proces jest jednostk adynamiczn a. W Uniksie procesy mog abyćwykonywanewspó lbieżnie (na jednym procesorze dzi eki prze l aczaniu kontekstu) wielozadaniowość 2.1 Identyfikatory zwi azane z procesami Podstawowe identyfikatory zwi azane z procesami oraz funkcje systemowe s luż ace do ich uzyskiwania: Nazwa Funkcja systemowa Opis UID uid t getuid(void); identyfikator użytkownika (rzeczywisty) GID gid t getgid(void); identyfikator grupy użytkownika (rzeczywisty) PID pid t getpid(void); identyfikator procesu PPID pid t getppid(void); identyfikator procesu macierzystego (przodka) PGID pid t getpgid(pid t pid); identyfikator grupy procesów (=PID lidera grupy) pid t getpgrp(void); getpgid(0); PGID procesu bież acego Powyższe identyfikatory przyjmuj awartościliczb ca lkowitych nieujemnych. Jedynie funkcja getpgid może zakończyć si eb l edem wówczas zwraca -1 iustawia zmienn a errno.
c Wies law P laczek 4 Pliki nag lówkowe niezb edne dla wywo lania powyższych funkcji: <sys/types.h> Zpoziomupow lokipodstawoweinformacjeobież acych procesach można uzyskać przy pomocy komendy ps np.ps -el podaje wykaz wszystkich bież acych procesów w tzw. d lugim formacie (wi ecej szczegó lów w podr eczniku systemowym man). Podgl ad najbardziej aktywnych procesów w czasie rzeczywistym można uzyskać za pomoc akomendy top. 2.2 Tworzenie procesów potomnych funkcja systemowa fork <sys/types.h> Prototyp pid t fork(void);! 0 wprocesiepotomnym 1 Tak! PID procesu potomnego wprocesiemacierzystym Funkcja systemowa fork tworzy proces potomny który jest kopi aprocesumacierzystego. Typowe wywo lanie funkcji fork switch (fork()) { case -1: perror("fork error"); exit(1); case 0: /* akcja dla procesu potomnego */ default: /* akcja dla procesu macierzystego np. wywolanie funkcji wait */ }; 2.3 Kończenie dzia lania procesu funkcje exit i exit <stdlib.h> Prototyp void exit(int status); Jednym ze sposobów zakończenia procesu jest wywo lanie funkcji bibliotecznej exit. Funkcja ta wykonuje operacje zakończenia dzia lania procesu i zwraca do procesu macierzystego ca lkowitoliczbow astatus oznaczaj ac astatuszakończeniaprocesu. Zgodnie z konwencj a w przypadku poprawnego zakończenia procesu zwracana jest 0
c Wies law P laczek 5 awprzypadkub l edu niezerowa 1.Dooznaczaniasukcesuczyporażkimożnaużyć sta lych: EXIT SUCCESS i EXIT FAILURE zdefiniowanychwpliku<stdlib.h>. Wywo lanie funkcji exit powoduje ponadto opróżnienie i zamkni ecie wszystkich otwartych strumieni oraz usuni ecie wszystkich tymczasowych plików utworzonych przy pomocy funkcji tmpfile. Można zdefiniować w lasne procedury zakończenia procesu i zerejestrować je przy pomocy funkcji bibliotecznych atexit i/lub on exit (patrz podr ecznik man). Takie procedury zostan awywo laneprzezfunkcj e exit w kolejności odwrotnej do kolejności ich rejestracji. Pozwala to m.in. na opróżnienie wszystkich buforów standardowej bibliotece wejściawyjścia. Prototyp void exit(int status); Funkcja exit różni si e od poprzedniej przede wszystkim tym że jest wywo laniem systemowym aniefunkcj abibliotekij ezyka C. Powoduje ona natychmiastowe zakończenie procesu. Wszystkie otwarte deskryptory plików należ ace do procesu s azamykanewszystkie jego procesy potomne s aadoptowane przezprocesinit adoprocesumacierzystego wysy lany jest sygna l SIGCHLD. Znaczenie parametru status jest takie jak dla funkcji exit. Wodróżnieniuodexit niewywo lujeonażadnychprocedurzarejestrowanychprzezfunkcje atexit lub on exit. Natomiast to czy opróżnia standardowe bufory wejścia-wyjścia oraz czy usuwa pliki tymczasowe stworzone przy użyciu funkcji tmpfile jest zależne od implementacji. Generalnie zaleca si eużywaniefunkcjiexit wprocesiemacierzystym(zawyj atkiem przypadku tworzenia procesów demonów) natomiast funkcji exit w procesach potomnych (by unikn ać efektów ubocznych). 2.4 Czekanie na procesy potomne funkcja systemowa wait W systemie UNIX na każdy proces za wyj atkiem procesu init (o identyfikatorze PID=1) powinien czekać jakiś proces macierzysty. Proces który si ezakończy lalenaktórynie czeka l żaden inny proces nazywa si e zombi. Proces-zombinicnierobialezajmujemiejsce w systemowej tabeli procesów. Aby unikn ać powstawania procesów-zombi w Uniksie procesy sieroty s aadoptowane przezprocesinit który w odniesieniu do nich wykonuje operacje czekania. <sys/types.h> <sys/wait.h> Prototyp pid t wait(int *stat loc); PID procesu potomnego 1 Tak 1 Faktycznie zwracanych jest tylko pierwszych osiem bitów zatem zwracane wartości należ adoprzedzia lu [0255].
c Wies law P laczek 6 Do oczekiwania na proces potomny s luży funkcja systemowa wait. Zawiesza ona dzia lanie procesu macierzystego do momentu zakończenia si e pierwszego procesu potomnego 2. Informacje o stanie potomka zwracane s aprzezparametrstat loc (tylko dwa m lodsze bajty s a używane). Jeśli proces potomny zakończy l si enormalnietonajm lodszy bajt b edzie równy 0 anast epny b edzie zawiera l kod powrotu. W przypadku zakończenia procesu potomnego na skutek sygna lu najm lodszy bajt b edzie zawiera l numer sygna lu anast epny 0 (w przypadku wygenerowania zrzutu pami eci core najstarszybit najm lodszego bajtu b edzie ustawiony na 1). Gdy parametr funkcji wait b edzie ustawiony na NULL to stan procesu potomnego nie zostanie zwrócony. Jeżeli dany proces nie ma procesów potomnych to funkcja kończy si eb l edem i ustawia zmienn a errno na ECHILD. <sys/types.h> <sys/wait.h> Prototyp pid t waitpid(pid t pid int *stat loc int options); PID procesu potomnego lub 0 1 Tak Lepsz afunkcjonalnośćniżfunkcjawait dostarcza funkcja waitpid. Funkcji tej można wskazać konkretny proces czy też grup e procesów na które ma czekać. Jeżeli argument pid > 0 i argument options = 0 to funkcja zablokuje wywo luj acy j aprocesdoczasu zakończenia procesu potomnego o PID = pid.znaczenieparametrustat loc jest takie jak dla funkcji wait. Wi ecej szczegó lów można znaleźć w podr eczniku systemowym man. ĆWICZENIE 1: Procesy Potomne: fork (1) Napisać program wypisuj acy identyfikatory UID GID PID PPID i PGID dla danego procesu. (2) Wywo lać funkcj e fork trzy razy (najlepiej w p etli for) iwypisaćpowyższeidentyfikatory dla procesu macierzystego oraz wszystkich procesów potomnych. (3) Wstawić funkcj e sleep tak aby procesy pojawia ly si enaekraniegrupowane pokoleniami od najstarszego do najm lodszego (! nie używać funkcji wait). (4) Na podstawie wyników programów narysować drzewo genealogiczne tworzonych procesów (z zaznaczonymi identyfikatorami).! Ile powstaje procesów i dlaczego? B Funkcja sleep: Prototyp unsigned sleep(unsigned seconds); Liczba nieprzespanych sekund 2 Uwaga: Funkcja wait czeka na zakończenie tylko jednego procesu potomnego tego który zakończy si e najwcześniej. W celu oczekiwania na zakończenie kolejnego procesu trzeba j a wywo lać ponownie.
c Wies law P laczek 7 2.5 Uruchamianie programów funkcja systemowa exec Funkcja systemowa exec s luży do ponownego zainicjowania procesu na podstawie wskazanego programu. Jest sześć odmian funkcji exec zgrupowanych w dwie rodziny (po trzy funkcje). Rodziny różni asi epostaci aargumentów: literal wnazwieoznacza argumenty w postaci listy a litera v wpostacitablicy(ang. vector). Poniżej omawiamy po jednym przedstawicielu każdej z rodzin. Prototyp int execl(const char *path const char *arg0... const char *argn char *null); int execv(const char *path char *const argv[ ]); Nic nie zwraca 1 Tak (pope lnia samobójstwo ) Argumenty funkcji exec: path ś c i e ż k o w a n a z w a p l i k u ( w y k o n a w c z e g o ) z a w i e r a j acego program; arg0 argument zerowy: nazwa pliku (wykon.) zawieraj acego program; arg1...argn argumenty wywo lania programu; null wskaźnik NULL; argv[ ] adres tablicy wskaźników na ci agi znaków b ed ace argumentami przekazywanymi do wykonywanego programu (ostatnim elementem powinien być NULL). Najcz eściej funkcj e exec wywo luje si e w po l aczeniu z funkcj a fork. Typowe wywo lanie fork i exec switch (fork()) { case -1: perror("fork error"); exit(1); case 0: /* proces potomny */ execl("./nowy_program.x""nowy_program.x"null); perror("execl error"); _exit(2); default: /* proces macierzysty */ }; ĆWICZENIE 2: Uruchamianie Programów: exec Napisać program podobny do poprzedniego ale taki w którym komunikaty procesów potomnych b ed a wypisywane przez program uruchamiany przez funkcj e exec.! Ile teraz powstaje procesów i dlaczego?