1 / 17

procesy

procesy. odrębne Unikatowy PID (2-32000) Zmienne Zbiory deskryptorów plików Przestrzeń stosu (lokalne zmienne, wywołania funkcji) Środowisko Licznik rozkazów dzielone Kod programu – brak możliwości zapisu Biblioteki systemowe. Uruchamianie procesów. #include <stdlib.h>

alessa
Download Presentation

procesy

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. procesy • odrębne • Unikatowy PID (2-32000) • Zmienne • Zbiory deskryptorów plików • Przestrzeń stosu (lokalne zmienne, wywołania funkcji) • Środowisko • Licznik rozkazów • dzielone • Kod programu – brak możliwości zapisu • Biblioteki systemowe

  2. Uruchamianie procesów #include <stdlib.h> system(const char *string) zwraca: 127 – nie można uruchomić powłoki -1 – inny błąd kod wy polecenia równoważne - sh –c string oczekuje na zakończenie procesu chyba że: system(„polecenie &”);

  3. Zastepowanie procesu(rodzina funkcji exec) #include <unistd.h> char **environ; int execl(const char *path, const char *arg0, (char *) 0); int execlp(const char *path, const char *arg0, (char *) 0); int execle(const char *path, const char *arg0, (char *) 0,const char *envp[]); int execv(const char *path, const char *argv[]); int execvp(const char *path, const char *argv[]); int execve(const char *path, const char *argv[], const char *envp[]);

  4. . . #include…. int main() { printf(„start\n”); execlp(„ps”, „ps”,”aux”,0); printf(„koniec\n”); exit(0); } • PID ps – a PID proc. mac. • brak powrotu do pr. mac. • proces potomny dziedziczy deskryptory plików

  5. Duplikowanie procesu #include <sys/types.h> #include <unistd.h> pid_t fork(void); Zwraca: • pid procesu potomnego - w procesie macierzystym • 0 - w procesie potomnym • -1 - błąd Proces potomny dziedziczy: zmienne, deskryptory plików

  6. #include <sys/types.h> #include <unistd.h> #include<stdio.h> ….. switch (fork()) { case –1; printf(„fork error”); exit(1); case 0; /* akcja dla procesu potomnego */ break; default; /* akcja dla procesu macierzystego */ break; }

  7. #include<sys/types.h> #include<unistd.h> …. switch (fork()) { case –1; printf(„fork error”); exit(1); case 0; /* proces potomny */ execl(„./program”,„program”,NULL); exit(2); default; /* proces macierzysty */ }

  8. getpid() • zwraca pid procesu wywołującego • zombie • proces potomny po zakończeniu – pozostaje w systemie (aż pr. mac. wykona wait lub się zakończy) • sierota • proces mac. zakończył pracę nieprawidłowo (PPID=1)

  9. oczekiwanie na zakończenie potomka #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat); pid_t waitpid(pid_t pid, int *stat, int opt); wait - zwraca pid procesu, który się zakończył pod adresem wskazywanym przez status umieszczany jest status zakończenia waitpid – opt =np. WNOHANG – zapobiega wstrzymywaniu procesu wywołującego (zwraca 0)

  10. Zarządzanie procesami: #include<stdio.h> int main() {int i,id,status; fprintf(stdout,”Mój PID %d\n”,getpid()); fprintf(stdout,”Teraz tworze potomka\n” ); id=fork(); if (id==0) fprintf(stdout,”id=%d to pisze proces potomny PID= %d\n”,id,getpid()); else { wait(&status); fprintf(stdout,”id =%d to pisze proces macierzysty id= %d\n”,id,getpid()); }; fprintf(stdout,”A to pisza obydwa procesy PID=%d\n”,getpid());}

  11. Komunikacja między procesami: • sygnały • pliki • łącza komunikacyjne • łącza nazwane ( kolejki FIFO) • semafory • komunikaty • pamięć dzielona

  12. Sygnały- jądro systemu oraz procesy mogą wysyłać sygnały do dowolnego procesu. Zestaw wszystkich sygnałów daje polecenie kill -l Sygnały są ponumerowane od 1 do 30 kill -9 PID - SIGKILL SIKILL, SIGSTOP - nie może być przechwycony przez proces i potraktowany inaczej SIGHUP - po zamknięciu sesji wszystkie procesy potomne procesu login dostają sygnał o numerze 1, powodujący ich przerwanie pod warunkiem, że nie przejmują tego sygnału i nie podejmują innego działania Można uruchomić program odporny na ten sygnał np. przez nohup dowolny program

  13. Sygnały fcja signal – manipulowanie sygnałami #include<signal.h> SIG_IGN – ignorowanie sygnału SIG_DFL – przywraca domyślne działanie (również po przechwyceniu danego sygnału) …. void au(int sig) {printf(„przechwytany sygnal %d\n”,sig);} int main() {…… (void) signal(SIGINT,au); …….. }

  14. #include<signal.h> int raise(int sig); - do siebie #include<sys/types.h> #include<signal.h> int kill(pid_t pid, int sig); - do procesu o identycznym uid #include<unistd.h> unsigned int alarm(unsigned int sec); int pause(void) alarm: • wysyła sygnał SIGALARM za sec sekund • każdy proces może mieć max. 1 zaplanowany alarm pause – wstrzymuje działanie programu do otrzymania sygnału sigaction – interfejs obsługi sygnałów

  15. Pliki- najczęstsza metoda komunikowania się procesów (jeden proces tworzy plik za pomocą dowolnego edytora, drugi przetwarza ten tekst – porządkuje alfabetycznie) problem: proces czytający może wyprzedzić proces piszący i uznać, że komunikacja została zakończona -> łącza komunikacyjne Łącza komunikacyjne • nie są plikami • chociaż mają swój i-węzeł • nie ma dowiązania w systemie plików • jeśli proces czytający zbyt wyprzedzi proces piszący -> oczekuje na dalsze dane; • jeśli proces piszący zbyt wyprzedzi proces czytający -> zostaje uśpiony • łącza komunikacyjne wykorzystywane z poziomu powłoki - potoki • dotyczą procesów pokrewnych • powolne

  16. Kolejki FIFO • łącza nazwane - kolejki FIFO (first-in-first-out) • plik specjalny (typ pliku - p) • może być otwarty przez każdy proces • umożliwia współpracę wielu procesów piszących i czytających (gwarantują niepodzielność) • powolne Semafory – • uniemożliwiają dostępu do zasobów dwóm lub większej liczbie procesów • flaga możliwa do ustawiana i opuszczania przez różne procesy Komunikaty • Procesy mogą przesłać do kolejki komunikatów niewielką ilość danych • Procesy, które mają uprawnienia mogą pobierać z niej kolejki komunikaty

  17. Pamięć dzielona • najszybszy sposób komunikacji między procesami • ten sam obszar pamięci jest przydzielany kilku procesom • danych wygenerowane przez jeden proces są natychmiast dostępne dla innych procesów • dostęp do pamięci dzielonej wymaga synchronizacji – semafory

More Related