Obsługa plików Procesy Systemy Operacyjne 2 laboratorium Mateusz Hołenko 15 października 2011
Plan zajęć 1 Obsługa plików 1 Pliki w systemie Linux i-węzły deskryptory plików 2 Operacje na plikach 3 Operacje na deskryptorach 4 Zadania 2 Procesy 1 Procesy w systemie Linux proces procesy macierzyste i potomne procesy zombie i sieroty 2 Funkcje systemowe 3 Zadania teoretyczne 4 Zadania praktyczne Mateusz Hołenko Obsługa plików, Procesy [1/40]
Plan zajęć 1 Obsługa plików 1 Pliki w systemie Linux i-węzły deskryptory plików 2 Operacje na plikach 3 Operacje na deskryptorach 4 Zadania 2 Procesy 1 Procesy w systemie Linux proces procesy macierzyste i potomne procesy zombie i sieroty 2 Funkcje systemowe 3 Zadania teoretyczne 4 Zadania praktyczne Mateusz Hołenko Obsługa plików, Procesy [1/40]
Obsługa plików Mateusz Hołenko Obsługa plików, Procesy [2/40]
Pliki w systemie Linux Mateusz Hołenko Obsługa plików, Procesy [3/40]
I-węzły (ang. I-nodes) plik podstawowa forma przechowywania danych w komputerze dla systemu operacyjnego plik jest ciągiem bajtów przechowywanych najczęściej w pamięci nieulotnej i-węzeł struktura systemu plików w tradycyjnych Linux ach zawierająca metainformacje o pliku, m.in.: właściciel pliku, prawa dostępu typ pliku, czasy dostępu ilość dowiązań, rozmiar pliku wskaźnik na fizyczną lokalizację pliku na dysku i-węzeł nie zawiera nazwy pliku ani ścieżki do niego! Mateusz Hołenko Obsługa plików, Procesy [4/40]
I-węzły (ang. I-nodes) plik podstawowa forma przechowywania danych w komputerze dla systemu operacyjnego plik jest ciągiem bajtów przechowywanych najczęściej w pamięci nieulotnej i-węzeł struktura systemu plików w tradycyjnych Linux ach zawierająca metainformacje o pliku, m.in.: właściciel pliku, prawa dostępu typ pliku, czasy dostępu ilość dowiązań, rozmiar pliku wskaźnik na fizyczną lokalizację pliku na dysku i-węzeł nie zawiera nazwy pliku ani ścieżki do niego! Mateusz Hołenko Obsługa plików, Procesy [4/40]
I-węzły (ang. I-nodes) plik podstawowa forma przechowywania danych w komputerze dla systemu operacyjnego plik jest ciągiem bajtów przechowywanych najczęściej w pamięci nieulotnej i-węzeł struktura systemu plików w tradycyjnych Linux ach zawierająca metainformacje o pliku, m.in.: właściciel pliku, prawa dostępu typ pliku, czasy dostępu ilość dowiązań, rozmiar pliku wskaźnik na fizyczną lokalizację pliku na dysku i-węzeł nie zawiera nazwy pliku ani ścieżki do niego! Mateusz Hołenko Obsługa plików, Procesy [4/40]
Deskryptory plików system plików przechowuje informacje o plikach w globalnej tablicy i-węzłów użytkownik odwołuje się do plików przez nazwy, systemu operacyjny przez indeks i-węzła w globalnej tablicy (identyfikator i-węzła, deskryptor pliku) każdy proces posiada lokalną tablicę i-węzłów (tablicę deskryptorów plików) zawierającą pliki skojarzone z procesem tablica jest niedostępna bezpośrednio dla programisty odwołuje się do niej przez wywołania funkcji systemowych domyślnie tablica zawiera trzy wpisy 0 stdin standardowe wejście 1 stdout standardowe wyjście 2 stderr standardowe wyjście diagnostyczne Mateusz Hołenko Obsługa plików, Procesy [5/40]
Deskryptory plików system plików przechowuje informacje o plikach w globalnej tablicy i-węzłów użytkownik odwołuje się do plików przez nazwy, systemu operacyjny przez indeks i-węzła w globalnej tablicy (identyfikator i-węzła, deskryptor pliku) każdy proces posiada lokalną tablicę i-węzłów (tablicę deskryptorów plików) zawierającą pliki skojarzone z procesem tablica jest niedostępna bezpośrednio dla programisty odwołuje się do niej przez wywołania funkcji systemowych domyślnie tablica zawiera trzy wpisy 0 stdin standardowe wejście 1 stdout standardowe wyjście 2 stderr standardowe wyjście diagnostyczne Mateusz Hołenko Obsługa plików, Procesy [5/40]
Deskryptory plików system plików przechowuje informacje o plikach w globalnej tablicy i-węzłów użytkownik odwołuje się do plików przez nazwy, systemu operacyjny przez indeks i-węzła w globalnej tablicy (identyfikator i-węzła, deskryptor pliku) każdy proces posiada lokalną tablicę i-węzłów (tablicę deskryptorów plików) zawierającą pliki skojarzone z procesem tablica jest niedostępna bezpośrednio dla programisty odwołuje się do niej przez wywołania funkcji systemowych domyślnie tablica zawiera trzy wpisy 0 stdin standardowe wejście 1 stdout standardowe wyjście 2 stderr standardowe wyjście diagnostyczne Mateusz Hołenko Obsługa plików, Procesy [5/40]
Operacje na plikach i deskryptorach Mateusz Hołenko Obsługa plików, Procesy [6/40]
Otwieranie i zamykanie plików otwieranie plików pathname nazwa pliku (wraz ze ścieżką) flags flagi otwarcia pliku, m.in.: O_WRONLY, O_RDONLY, O_RDWR, O_APPEND, O_CREAT, O_TRUNC mode prawa dostępu tworzonego pliku int open(const char* pathname, int flags) int open(const char* pathname, int flags, mode_t mode) zamykanie pliku fd deskryptor zamykanego pliku int close(int fd) Mateusz Hołenko Obsługa plików, Procesy [7/40]
Otwieranie i zamykanie plików otwieranie plików pathname nazwa pliku (wraz ze ścieżką) flags flagi otwarcia pliku, m.in.: O_WRONLY, O_RDONLY, O_RDWR, O_APPEND, O_CREAT, O_TRUNC mode prawa dostępu tworzonego pliku int open(const char* pathname, int flags) int open(const char* pathname, int flags, mode_t mode) zamykanie pliku fd deskryptor zamykanego pliku int close(int fd) Mateusz Hołenko Obsługa plików, Procesy [7/40]
Otwieranie i zamykanie plików przykładowy program #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <errno.h> int main(int argc, char* argv[]) { int fd; if (argc!= 2) { printf("usage: fexist [filepath]\n"); return 1; } fd = open(argv[1], O_RDONLY); if (fd == -1) { printf("couldn t open file %s (error code %d)\n", argv[1], errno); perror("opening file"); return 2; } else { printf("file %s opened successfully!\n", argv[1]); if (close(fd) == -1) { printf("couldn t close file %s (error code %d)\n", argv[1], errno); perror("closing file"); } } return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Mateusz Hołenko Obsługa plików, Procesy [8/40]
Odczyt i zapis danych odczyt danych z plików fd deskryptor pliku (uzyskany z funkcji open) buf adres początku obszaru pamięci, w którym zostaną umieszczone odczytane dane count liczba bajtów do odczytu ssize_t read(int fd, void* buf, size_t count) zapis danych do pliku fd deskryptor pliku (uzyskany z funkcji open) buf adres początku obszaru pamięci, zawierającego blok danych do zapisania count liczba bajtów do zapisania ssize_t write(int fd, const void* buf, size_t count) Mateusz Hołenko Obsługa plików, Procesy [9/40]
Odczyt i zapis danych odczyt danych z plików fd deskryptor pliku (uzyskany z funkcji open) buf adres początku obszaru pamięci, w którym zostaną umieszczone odczytane dane count liczba bajtów do odczytu ssize_t read(int fd, void* buf, size_t count) zapis danych do pliku fd deskryptor pliku (uzyskany z funkcji open) buf adres początku obszaru pamięci, zawierającego blok danych do zapisania count liczba bajtów do zapisania ssize_t write(int fd, const void* buf, size_t count) Mateusz Hołenko Obsługa plików, Procesy [9/40]
Odczyt i zapis danych przykładowy program... char buf[20]; int n; while ((n = read(fd, buf, 20)) > 0) { write(1, buf, n); }... 1 2 3 4 5 6 7 8 9 10 11 Mateusz Hołenko Obsługa plików, Procesy [10/40]
Przesuwanie wskaźnika bieżącej pozycji i skracanie przesuwanie wskaźnika fd deskryptor pliku (uzyskany z funkcji open) offset wielkość przesunięcia count odniesienie: SEEK_SET, SEEK_CUR, SEEK_END off_t lseek(int fd, off_t offset, int whence) skracanie pliku path nazwa pliku (wraz ze ścieżką) fd deskryptor pliku (uzyskany z funkcji open) length docelowa długość pliku int truncate(const char* path, off_t length) int ftruncate(int fd, off_t length) Mateusz Hołenko Obsługa plików, Procesy [11/40]
Przesuwanie wskaźnika bieżącej pozycji i skracanie przesuwanie wskaźnika fd deskryptor pliku (uzyskany z funkcji open) offset wielkość przesunięcia count odniesienie: SEEK_SET, SEEK_CUR, SEEK_END off_t lseek(int fd, off_t offset, int whence) skracanie pliku path nazwa pliku (wraz ze ścieżką) fd deskryptor pliku (uzyskany z funkcji open) length docelowa długość pliku int truncate(const char* path, off_t length) int ftruncate(int fd, off_t length) Mateusz Hołenko Obsługa plików, Procesy [11/40]
Tworzenie i usuwanie plików tworzenie pliku pathname nazwa pliku (wraz ze ścieżką) mode prawa dostępu tworzonego pliku int creat(const char* pathname, mode_t mode) usuwanie pliku pathname nazwa pliku (wraz ze ścieżką) int unlink(const char* pathname) Mateusz Hołenko Obsługa plików, Procesy [12/40]
Tworzenie i usuwanie plików tworzenie pliku pathname nazwa pliku (wraz ze ścieżką) mode prawa dostępu tworzonego pliku int creat(const char* pathname, mode_t mode) usuwanie pliku pathname nazwa pliku (wraz ze ścieżką) int unlink(const char* pathname) Mateusz Hołenko Obsługa plików, Procesy [12/40]
Operacje na deskryptorach tworzenie duplikatu deskryptora oldfd deskryptor do powielenia newfd numer nowo przydzielanego deskryptora int dup(int oldfd) int dup2(int oldfd, int newfd) Mateusz Hołenko Obsługa plików, Procesy [13/40]
Zadania Mateusz Hołenko Obsługa plików, Procesy [14/40]
Zadania Zadanie 1 Napisz program kopiujący zawartość pliku o nazwie podanej jako pierwszy parametr do pliku, którego nazwa podana jest jako drugi parametr. Zadanie 2 Napisz program zmieniający kolejność znaków w każdej linii pliku o nazwie podanej jako parametr. Zadanie 3 Napisz program wyszukujący najdłuższą linię w pliku i podający ilość znaków w tej linii. Mateusz Hołenko Obsługa plików, Procesy [15/40]
Zadania Zadanie 1 Napisz program kopiujący zawartość pliku o nazwie podanej jako pierwszy parametr do pliku, którego nazwa podana jest jako drugi parametr. Zadanie 2 Napisz program zmieniający kolejność znaków w każdej linii pliku o nazwie podanej jako parametr. Zadanie 3 Napisz program wyszukujący najdłuższą linię w pliku i podający ilość znaków w tej linii. Mateusz Hołenko Obsługa plików, Procesy [15/40]
Zadania Zadanie 1 Napisz program kopiujący zawartość pliku o nazwie podanej jako pierwszy parametr do pliku, którego nazwa podana jest jako drugi parametr. Zadanie 2 Napisz program zmieniający kolejność znaków w każdej linii pliku o nazwie podanej jako parametr. Zadanie 3 Napisz program wyszukujący najdłuższą linię w pliku i podający ilość znaków w tej linii. Mateusz Hołenko Obsługa plików, Procesy [15/40]
Zadania Zadanie 4 Napisz program określający rozmiar pliku/kilku plików o nazwach podanych jako parametry wejściowy. Zadanie 5 Napisz program wypisujący od końca zawartość pliku (1) znakami, (2) liniami. Mateusz Hołenko Obsługa plików, Procesy [16/40]
Zadania Zadanie 4 Napisz program określający rozmiar pliku/kilku plików o nazwach podanych jako parametry wejściowy. Zadanie 5 Napisz program wypisujący od końca zawartość pliku (1) znakami, (2) liniami. Mateusz Hołenko Obsługa plików, Procesy [16/40]
Procesy Mateusz Hołenko Obsługa plików, Procesy [17/40]
Procesy w systemie Linux Mateusz Hołenko Obsługa plików, Procesy [18/40]
Proces proces to nie program! pojęcie abstrakcyjne program w trakcie wykonywania procesami zarządza system operacyjny procesom przydzielane są zasoby systemowe procesor pamięć operacyjna urządzenia zewnętrzne Mateusz Hołenko Obsługa plików, Procesy [19/40]
Proces proces to nie program! pojęcie abstrakcyjne program w trakcie wykonywania procesami zarządza system operacyjny procesom przydzielane są zasoby systemowe procesor pamięć operacyjna urządzenia zewnętrzne Mateusz Hołenko Obsługa plików, Procesy [19/40]
Proces proces to nie program! pojęcie abstrakcyjne program w trakcie wykonywania procesami zarządza system operacyjny procesom przydzielane są zasoby systemowe procesor pamięć operacyjna urządzenia zewnętrzne Mateusz Hołenko Obsługa plików, Procesy [19/40]
Proces proces to nie program! pojęcie abstrakcyjne program w trakcie wykonywania procesami zarządza system operacyjny procesom przydzielane są zasoby systemowe procesor pamięć operacyjna urządzenia zewnętrzne Mateusz Hołenko Obsługa plików, Procesy [19/40]
Procesy macierzyste i potomne procesy tworzą hierarchię proces główny nazywa się init proces tworzący inne procesy staje się dla nich rodzicem (procesem macierzystym) wynik polecenia ps l a (PID identyfikator procesu, PPID identyfikator rodzica procesu) F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND... 0 0 1773 1 20 0 6196 644 n_tty_ Ss+ tty1 0 :00 / sbin / getty... tty1 0 1000 2090 2028 20 0 26188 6532 wait Ss pts /0 0 :00 / bin / bash 0 1000 32096 2090 20 0 10660 1156 R+ pts /0 0 : 00 ps l a Mateusz Hołenko Obsługa plików, Procesy [20/40]
Procesy macierzyste i potomne procesy tworzą hierarchię proces główny nazywa się init proces tworzący inne procesy staje się dla nich rodzicem (procesem macierzystym) wynik polecenia ps l a (PID identyfikator procesu, PPID identyfikator rodzica procesu) F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND... 0 0 1773 1 20 0 6196 644 n_tty_ Ss+ tty1 0 :00 / sbin / getty... tty1 0 1000 2090 2028 20 0 26188 6532 wait Ss pts /0 0 :00 / bin / bash 0 1000 32096 2090 20 0 10660 1156 R+ pts /0 0 : 00 ps l a Mateusz Hołenko Obsługa plików, Procesy [20/40]
Procesy macierzyste i potomne procesy tworzą hierarchię proces główny nazywa się init proces tworzący inne procesy staje się dla nich rodzicem (procesem macierzystym) wynik polecenia ps l a (PID identyfikator procesu, PPID identyfikator rodzica procesu) F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND... 0 0 1773 1 20 0 6196 644 n_tty_ Ss+ tty1 0 :00 / sbin / getty... tty1 0 1000 2090 2028 20 0 26188 6532 wait Ss pts /0 0 :00 / bin / bash 0 1000 32096 2090 20 0 10660 1156 R+ pts /0 0 : 00 ps l a Mateusz Hołenko Obsługa plików, Procesy [20/40]
Procesy zombie i sieroty procesy mogą kończyć swoje działanie w różnej kolejności procesy sieroty (ang. orphan) proces macierzysty się zakończył procesem macierzystym staje się init procesy zombie (ang. zombie) proces zakończył się, ale czeka na przekazanie statusu zakończenia nie zajmuje procesora ani innych zasobów występuje w tablicy procesów (tam znajduje się bowiem status zakończenia procesu) Mateusz Hołenko Obsługa plików, Procesy [21/40]
Procesy zombie i sieroty procesy mogą kończyć swoje działanie w różnej kolejności procesy sieroty (ang. orphan) proces macierzysty się zakończył procesem macierzystym staje się init procesy zombie (ang. zombie) proces zakończył się, ale czeka na przekazanie statusu zakończenia nie zajmuje procesora ani innych zasobów występuje w tablicy procesów (tam znajduje się bowiem status zakończenia procesu) Mateusz Hołenko Obsługa plików, Procesy [21/40]
Procesy zombie i sieroty procesy mogą kończyć swoje działanie w różnej kolejności procesy sieroty (ang. orphan) proces macierzysty się zakończył procesem macierzystym staje się init procesy zombie (ang. zombie) proces zakończył się, ale czeka na przekazanie statusu zakończenia nie zajmuje procesora ani innych zasobów występuje w tablicy procesów (tam znajduje się bowiem status zakończenia procesu) Mateusz Hołenko Obsługa plików, Procesy [21/40]
Funkcje systemowe Mateusz Hołenko Obsługa plików, Procesy [22/40]
Pobieranie identyfikatorów identyfikator procesu PID pid_t getpid(void) identyfikator rodzica procesu PPID pid_t getppid(void) Mateusz Hołenko Obsługa plików, Procesy [23/40]
Pobieranie identyfikatorów identyfikator procesu PID pid_t getpid(void) identyfikator rodzica procesu PPID pid_t getppid(void) Mateusz Hołenko Obsługa plików, Procesy [23/40]
Tworzenie procesów potomnych tworzenie procesu potomnego pid_t fork(void) przykład zastosowania #include <unistd.h> #include <stdio.h> int main(int argc, char* argv[]) { printf("początek programu\n"); if (fork() == 0) { printf("tutaj pisze proces potomny!\n"); } else { printf("tutaj pisze proces macierzysty!\n"); } printf("tutaj piszą oba procesy!\n"); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Mateusz Hołenko Obsługa plików, Procesy [24/40]
Tworzenie procesów potomnych tworzenie procesu potomnego pid_t fork(void) przykład zastosowania #include <unistd.h> #include <stdio.h> int main(int argc, char* argv[]) { printf("początek programu\n"); if (fork() == 0) { printf("tutaj pisze proces potomny!\n"); } else { printf("tutaj pisze proces macierzysty!\n"); } printf("tutaj piszą oba procesy!\n"); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Mateusz Hołenko Obsługa plików, Procesy [24/40]
Uruchamianie programu w ramach procesu rodzina funkcji exec int execl(const char *path, const char *arg,...) int execlp(const char *file, const char *arg,...) int execle(const char *path, const char *arg,..., char *const envp[]) int execv(const char *path, char *const argv[]) int execvp(const char *file, char *const argv[]) int execve(const char *file, char *const argv[], char *const envp[]) poprawne wykonanie funkcji exec powoduje bezpowrotną zmianę wykonywanego programu! sugerowane wykorzystanie w połączeniu z funkcją fork Mateusz Hołenko Obsługa plików, Procesy [25/40]
Uruchamianie programu w ramach procesu rodzina funkcji exec int execl(const char *path, const char *arg,...) int execlp(const char *file, const char *arg,...) int execle(const char *path, const char *arg,..., char *const envp[]) int execv(const char *path, char *const argv[]) int execvp(const char *file, char *const argv[]) int execve(const char *file, char *const argv[], char *const envp[]) poprawne wykonanie funkcji exec powoduje bezpowrotną zmianę wykonywanego programu! sugerowane wykorzystanie w połączeniu z funkcją fork Mateusz Hołenko Obsługa plików, Procesy [25/40]
Kończenie i zabijanie procesu zakończenie działania procesu i zwrócenie statusu zakończenia status status zakończenia procesu proces zakończony poprawnie: 0 błąd: inna wartość void exit(int status) zabicie procesu potomnego pid identyfikator procesu, który ma zostać zabity (patrz man 2 kill!) sig numer sygnału wysyłany do procesu potomnego int kill(pid_t pid, int sig) Mateusz Hołenko Obsługa plików, Procesy [26/40]
Kończenie i zabijanie procesu zakończenie działania procesu i zwrócenie statusu zakończenia status status zakończenia procesu proces zakończony poprawnie: 0 błąd: inna wartość void exit(int status) zabicie procesu potomnego pid identyfikator procesu, który ma zostać zabity (patrz man 2 kill!) sig numer sygnału wysyłany do procesu potomnego int kill(pid_t pid, int sig) Mateusz Hołenko Obsługa plików, Procesy [26/40]
Synchronizacja procesów synchronizacja procesu macierzystego i potomnego status adres komórki pamięci, do którego zapisany zostanie status zakończenia procesu potomnego pid identyfikator procesu, na którego zakończenie funkcja ma oczekiwać (patrz man 2 wait!) options opcje określające sposób zakończenia funkcji pid_t wait(int* status) pid_t waitpid(pid_t pid, int* status, int options) Mateusz Hołenko Obsługa plików, Procesy [27/40]
Przykład wykorzystania funkcji exec #include <unistd.h> #include <stdio.h> int main(int argc, char* argv[]) { printf("początek działania programu\n"); if (fork() == 0) { execlp("ls", "ls", "-a", NULL); perror("błąd uruchamiania programu!"); exit(1); } wait(null); printf("koniec działania programu\n"); return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Mateusz Hołenko Obsługa plików, Procesy [28/40]
Przekierowywanie strumieni wejściowych/wyjściowych proces potomny dziedziczy tablicę otwartych deskryptorów przekierowania procesów ustawione przed wywołaniem funkcji fork obowiązują również w procesie potomnym! przykładowy program #include <unistd.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char* argv[]) { dup2(creat("ls-out", 0600), 1); execvp("ls", argv); } 1 2 3 4 5 6 7 8 9 Mateusz Hołenko Obsługa plików, Procesy [29/40]
Przekierowywanie strumieni wejściowych/wyjściowych proces potomny dziedziczy tablicę otwartych deskryptorów przekierowania procesów ustawione przed wywołaniem funkcji fork obowiązują również w procesie potomnym! przykładowy program #include <unistd.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char* argv[]) { dup2(creat("ls-out", 0600), 1); execvp("ls", argv); } 1 2 3 4 5 6 7 8 9 Mateusz Hołenko Obsługa plików, Procesy [29/40]
Przekierowywanie strumieni wejściowych/wyjściowych proces potomny dziedziczy tablicę otwartych deskryptorów przekierowania procesów ustawione przed wywołaniem funkcji fork obowiązują również w procesie potomnym! przykładowy program #include <unistd.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char* argv[]) { dup2(creat("ls-out", 0600), 1); execvp("ls", argv); } 1 2 3 4 5 6 7 8 9 Mateusz Hołenko Obsługa plików, Procesy [29/40]
Zadania teoretyczne Mateusz Hołenko Obsługa plików, Procesy [30/40]
Ile procesów zostanie stworzonych? #include <unistd.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char* argv[]) { fork(); fork(); if(fork() == 0) fork(); fork(); } return 0; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Mateusz Hołenko Obsługa plików, Procesy [31/40]
Odpowiedź @-----------------------------------+ @-----------------+ @-----------------+ @-----+ @-----+ @-----+ @-----+ @-----+ @-----+ @-----+ @-----+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Mateusz Hołenko Obsługa plików, Procesy [32/40]
Ile procesów zostanie stworzonych? #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> int main(int argc, char* argv[]) { fork(); fork(); if(fork()!= 0) exit(0); fork(); } return 0; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Mateusz Hołenko Obsługa plików, Procesy [33/40]
Odpowiedź @-----------------------------------+ @-----------------+ @-----------------+ @-----+ @-----+ @-----+ @-----+ x @-----+ x @-----+ x @-----+ x @-----+ 1 2 3 4 5 6 7 8 Mateusz Hołenko Obsługa plików, Procesy [34/40]
Ile procesów zostanie stworzonych? #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> int main(int argc, char* argv[]) { fork(); fork(); if(fork()!= 0) if(fork() == 0) fork(); else exit(0); fork(); } return 0; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Mateusz Hołenko Obsługa plików, Procesy [35/40]
Odpowiedź @----------------------------------------+ @-----------------------------------+ @-----------------------------------+ @--------------+ @--------------+ @--------------+ @--------------+ @--+ @--+ @--+ @--+ x @-----+ x @-----+ x @-----+ x @-----+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ @--+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Mateusz Hołenko Obsługa plików, Procesy [36/40]
Zadania praktyczne Mateusz Hołenko Obsługa plików, Procesy [37/40]
Zadania Zadanie 1 Napisz program tworzący dwa procesy. Każdy ze stworzonych procesów powinien utworzyć proces potomka. Należy wyświetlać identyfikatory procesów rodziców i potomków po każdym wywołaniu funkcji fork. Zadanie 2 Napisz program wypisujący napis Poczatek, następnie wywołujący funkcję fork i wypisujący napis Koniec. Co jest efektem uruchomienia tego programu? Mateusz Hołenko Obsługa plików, Procesy [38/40]
Zadania Zadanie 1 Napisz program tworzący dwa procesy. Każdy ze stworzonych procesów powinien utworzyć proces potomka. Należy wyświetlać identyfikatory procesów rodziców i potomków po każdym wywołaniu funkcji fork. Zadanie 2 Napisz program wypisujący napis Poczatek, następnie wywołujący funkcję fork i wypisujący napis Koniec. Co jest efektem uruchomienia tego programu? Mateusz Hołenko Obsługa plików, Procesy [38/40]
Zadania Zadanie 3 Napisz program wypisujący napis Poczatek, następnie wywołujący funkcję exec powodującą wydruk zawartości bieżącego katalogu i następnie wypisujący napis Koniec. Co jest efektem uruchomienia tego programu? Zadanie 4 Napisz program którego rezultatem będzie wydruk zawartości bieżącego katalogu poprzedzony napisem Poczatek a zakończony napisem Koniec. Mateusz Hołenko Obsługa plików, Procesy [39/40]
Zadania Zadanie 3 Napisz program wypisujący napis Poczatek, następnie wywołujący funkcję exec powodującą wydruk zawartości bieżącego katalogu i następnie wypisujący napis Koniec. Co jest efektem uruchomienia tego programu? Zadanie 4 Napisz program którego rezultatem będzie wydruk zawartości bieżącego katalogu poprzedzony napisem Poczatek a zakończony napisem Koniec. Mateusz Hołenko Obsługa plików, Procesy [39/40]
Zadania Zadanie 5 Napisz program, którego wynikiem jest sformatowana lista procesów: poczatek listy proces 1 proces2... koniec listy Zadanie 6 Napisz program tworzący równocześnie trzy procesy zombi. Mateusz Hołenko Obsługa plików, Procesy [40/40]
Zadania Zadanie 5 Napisz program, którego wynikiem jest sformatowana lista procesów: poczatek listy proces 1 proces2... koniec listy Zadanie 6 Napisz program tworzący równocześnie trzy procesy zombi. Mateusz Hołenko Obsługa plików, Procesy [40/40]