1 / 49

LINUX PROGRAMOWANIE SYSTEMOWE [3/3]

LINUX PROGRAMOWANIE SYSTEMOWE [3/3]. Plan wykładu. Pliki Podstawowe operacje na plikach Pliki w środowisku wielu użytkowników Pliki z wieloma nazwami Informacje o plikach Katalogi Implementacja katalogu Podstawowe operacje na katalogach Potoki Nienazwane Nazwane. Pliki. Pliki

alissa
Download Presentation

LINUX PROGRAMOWANIE SYSTEMOWE [3/3]

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. LINUX PROGRAMOWANIE SYSTEMOWE [3/3]

  2. Plan wykładu • Pliki • Podstawowe operacje na plikach • Pliki w środowisku wielu użytkowników • Pliki z wieloma nazwami • Informacje o plikach • Katalogi • Implementacja katalogu • Podstawowe operacje na katalogach • Potoki • Nienazwane • Nazwane

  3. Pliki • Pliki • Podstawowe operacje na plikach • Pliki w środowisku wielu użytkowników • Pliki z wieloma nazwami • Informacje o plikach • Katalogi • Potoki

  4. Plan wykładu • Pliki • Podstawowe operacje na plikach • Pliki w środowisku wielu użytkowników • Pliki z wieloma nazwami • Informacje o plikach • Katalogi • Potoki

  5. Struktury danych po wywołaniu open dp1 = open(„/etc/passwd”, O_RDONLY); dp2 = open(„lokalny”, O_RDWR); dp3 = open(„/etc/passwd”, O_WRONLY); „Budowa systemu operacyjnego UNIX” J.Bach

  6. Struktury danych po otwarciu plików przez dwa procesy Proces A: dp1 = open(„/etc/passwd”, O_RDONLY); dp2 = open(„lokalny”, O_RDWR); dp3 = open(„/etc/passwd”, O_WRONLY); Proces B: dp1 = open(„/etc/passwd”, O_RDONLY); dp2 = open(„prywatny”, O_RDONLY); „Budowa systemu operacyjnego UNIX” J.Bach

  7. Otwieranie pliku open (1/2) • int open( const char *pathname, int flags); • Funkcja systemowa open służy do przekształcenia ścieżki pathname na deskryptor pliku. Jeśli wywołanie się powiedzie, to zwrócony deskryptor pliku będzie najmniejszym aktualnie nie otwartym deskryptorem pliku dla tego procesu (indeksem do tablicy deskryptorów otwartych plików). • Ważniejsze flagi (mogą być składane jako suma bitowa): • O_RDONLY– otwarcie pliku jedynie do odczytu, • O_WRONLY– otwarcie pliku jedynie do zapisu, • O_RDWR – otwarcie pliku do odczytu i zapisu,

  8. Otwieranie pliku open (2/2) • O_TRUNC – jeżeli plik istnieje to po otwarciu jego długość jest ustawiana na 0, • O_APPEND– otwarcie pliku w trybie dopisywania (przed każdą operacją write, wskaźnik pliku jest ustawiany na koniec pliku), • O_NONBLOCK (lub O_NDELAY) - plik jest otwierany w trybie nieblokującym (ma znaczenie jedynie przy potokach nazwanych), • O_CREATE – jeśli plik nie istnieje, to będzie utworzony (patrz slajd „Tworzenie pliku open, creat”), • O_EXCL – gdy zostanie użyte w połączeniu z O_CREAT, to jeśli plik już istnieje, open się nie powiedzie (patrz slajd „Tworzenie pliku open, creat”).

  9. Tworzenie pliku open, creat (1/2) • int open( const char *pathname, int flags, mode_t mode); • int creat( const char *pathname, mode_t mode); • F-cja creat tworzy nowy plik o nazwie pathnamei prawach dostępu mode, a następnie otwiera go zwracając odpowiedni deskryptor pliku. F-cja ta jest równoważne open z argumentem flags ustawionym na O_CREAT|O_WRONLY|O_TRUNC. • Prawa nadane nowo tworzonemu plikowi są wypadkową umask procesu i zmiennej mode zgodnie z zasadą: (mode & ~umask).

  10. Tworzenie pliku open, creat (2/2) • Stałe symboliczne dla parametru mode: • S_IRWXU – (0700) - użytkownik ma prawa odczytu, zapisu i uruchamiania, • S_IRUSR– (0400) - użytkownik ma prawa odczytu, • S_IWUSR – (0200) - użytkownik ma prawa zapisu, • S_IXUSR – (0100) - użytkownik ma prawa uruchamiania, • S_IRWXG – (0070) - grupa ma prawa odczytu, zapisu i uruchamiania • S_IRGRP – (0040) - grupa ma prawa odczytu, • S_IWGRP – (0020) - grupa ma prawa zapisu, • S_IXGRP – (0010) - grupa ma prawa uruchamiania, • S_IRWXO – (0007) - inni mają prawa odczytu, zapisu i uruchamiania, • S_IROTH – (0004) - inni mają prawa odczytu, • S_IWOTH – (0002) - inni mają prawa zapisu, • S_IXOTH – (0001) - inni mają prawa uruchamiania.

  11. Zamykanie pliku close • int close( intfd); • Funkcja zamyka deskryptor pliku, tak że nie odnosi się on już później do żadnego pliku i może być użyty ponownie. • Funkcja zwraca zero po pomyślnym zakończeniu, a -1 gdy wystąpi błąd.

  12. Przykład tworzenia i otwierania pliku test-open.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main () { int p1, p2, p3, p4; p1 = open( "test_1", O_RDONLY); p2 = open( "test_2", O_CREAT | O_TRUNC | O_RDWR, 0640 ); p3 = open( "test_3", O_CREAT | O_EXCL | O_WRONLY, 0664 ); p4 = creat( "test_4", 0770 ); ... close( p1); close( p2); close( p3); close( p4); return 0; }

  13. Odczyt pliku read • ssize_t read( intfd, void *buf, size_tcount); • Funkcja próbuje odczytać maksymalnie countbajtów z deskryptora plików fd do bufora, którego początek znajduje się pod adresem buf. • Po pomyślnym zakończeniu zwracana jest liczba odczytanych bajtów, oraz o tę wartość przesuwana jest pozycja w pliku. • Jeśli zwrócona liczba jest mniejsza niż liczba żądanych bajtów, to może oznaczać to, że aktualnie dostępnych jest mniej bajtów (np. z powodu dojścia do końca pliku).

  14. Zapis pliku write • ssize_t write( int fd, const void *buf, size_t count); • Funkcja zapisuje maksymalnie count bajtów do pliku wskazywanego przez deskryptor fd. Zapis następuje z bufora wskazywanego przez buf. • Dane są zapisywane od aktualnej pozycji w pliku i nadpisują dane już istniejące. Jeżeli plik jest za krótki, to zostanie zwiększony. Aktualna pozycja w pliku przesuwa się na koniec zapisu. • Jeżeli przy otwarciu użyto flagę O_APEND to zapis zawsze będzie następował na końcu pliku.

  15. Bezpośredni dostęp do pliku lseek • off_t lseek( int fildes, off_t offset, int whence); • Funkcja zmienia aktualną pozycję odczytu/zapisu w pliku związanego z deskryptorem fildes o wartość podaną w argumencie offset. • Przesunięcie można określić względem argumentu whence: • SEEK_SET– od początku pliku, • SEEK_CUR– od pozycji aktualnej, • SEEK_END – od końca pliku. • Po pomyślnym zakończeniu f-cja zwraca ustawione przesunięcie, liczone w bajtach od początku pliku.

  16. Przykład odczytu i zapisu pliku (1/2) test-read.c [1/2] #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> char buff[ 4]; unsigned int a, retVal; int main () { int p1; p1 = open( "test_1", O_RDONLY); if( p1 != -1) { retVal = read( p1, buff, sizeof( buff)); retVal = lseek( p1, 0, SEEK_SET); ...

  17. Przykład odczytu i zapisu pliku (2/2) c.d. test-read.c [2/2] ... retVal = read( p1, &a, sizeof( a)); retVal = lseek( p1, -sizeof( a), SEEK_CUR); close( p1); } return 0; }

  18. Kasowanie pliku unlink, remove • int unlink( const char *pathname); • int remove( const char *pathname); • Funkcja unlink kasuje nazwę pathname z systemu plików. Jeżeli ta nazwa była ostatnim dowiązaniem do pliku (i-węzła) i żaden proces nie ma otwartego dojścia do tego plikuto plik zostanie fizycznie usunięty z dysku. • Jeżeli było to ostatnie dowiązanie, ale plik jest jeszcze otwarty przez jakiś proces, to zostaje oznaczony do usunięcia i zostanie skasowany natychmiast po zamknięciu go przez proces. • Funkcja remove działa dla plików regularnych tak jak unlink, dla katalogów jak rmdir.

  19. Pliki w środowisku wielu użytkowników • Pliki • Podstawowe operacje na plikach • Pliki w środowisku wielu użytkowników • Pliki z wieloma nazwami • Informacje o plikach • Katalogi • Potoki

  20. Dodatkowe uprawnienia dla plików wykonywalnych

  21. Maska tworzenia pliku umask • mode_t umask( mode_t maska); • F-cja modyfikuje aktualną maskę UMASK procesu zgodnie z zawartością zmiennej mask według schematu: mask & 0777. • F-cja zwraca wartość maski sprzed zmiany. • Maska jest wykorzystywana m.in. przez open do nadawania nowoutworzonym plikom początkowych praw dostępu (prawa z maski są wyłączane z praw podanych w open). UMASK = 022 open( "test", O_CREAT, 0666); test rw- r–- r-- (0644)

  22. Dostępność pliku access • int access(const char *pathname, int mode); • Funkcja sprawdza istnienie i prawa użytkownika do pliku o nazwie pathname. • Argument modejest maską składającą się z jednego lub więcej znaczników: • F_OK – czy plik istnieje, • R_OK – czy plik istnieje i użytkownik ma prawo do jego odczytu, • W_OK – czy plik istnieje i użytkownik ma prawo do jego zapisu, • X_OK – czy plik istnieje i użytkownik ma prawo do jego wykonania.

  23. Zmiana uprawnień chmod • int chmod( const char *path, mode_t mode); • Funkcja zmienia prawa dostępu do pliku określonego przez path na prawa podane w argumencie mode (znaczenie argumentu jak w funkcji open). • Dla poprawnego działania funkcji efektywny UID procesu musi być zerem, lub odpowiadać właścicielowi pliku.

  24. Zmiana właściciela chown • int chown(const char *path, uid_t owner, gid_t group); • Zmieniony zostaje właściciel pliku określonego przez pathlub przez deskryptor fd. Tylko superużytkownik może zmieniać właściciela pliku. • Właściciel pliku może zmieniać tylko grupę pliku na dowolną grupę, której jest członkiem. Superużytkownik może zmieniać grupę bez ograniczeń. • Jeśli owner lub group jest podane jako -1, to ten identyfikator nie jest wtedy zmieniany.

  25. Pliki z wieloma nazwami • Pliki • Podstawowe operacje na plikach • Pliki w środowisku wielu użytkowników • Pliki z wieloma nazwami • Informacje o plikach • Katalogi • Potoki

  26. Łącza twarde i symboliczne • Łącze twarde - f-cje link i unlink link( ”abc”, ”xyz”); I-węzeł 235: licznik dowiązań = 1 I-węzeł 235: licznik dowiązań = 2 unlink( ”xyz”); unlink( ”abc”); I-węzeł 235: licznik dowiązań = 0 I-węzeł 235: licznik dowiązań = 1 • Łącze symboliczne - f-cje symlink i readlink „UNIX. Programowanie systemowe” K.Haviland

  27. Tworzenie dowiązaniatwardegolink • int link(const char *oldpath, const char *newpath); • Funkcja tworzy nowe dowiązanie (nazywane też dowiązaniem twardym) do istniejącego pliku (i-węzła) o nazwie oldpath. Jeśli plik newpath już istnieje, to nie będzie nadpisany. • Twarde dowiązania, tworzone z pomocą link, nie mogą wykraczać poza jeden system plików, ani odnosić się do katalogu. W takich sytuacjach można użyć funkcji symlink.

  28. Usuwanie dowiązania unlink • int unlink(const char *pathname); • Funkcja usuwa nazwę dowiązaną do i-węzła. Jeżeli jest to ostatnia nazwa, to i-węzeł jest usuwany.

  29. Tworzenie dowiązaniasymbolicznego symlink • int symlink( const char *oldpath, const char *newpath); • Funkcja tworzy dowiązanie symboliczne o nazwie newpath, które zawiera łańcuch znakowy oldpath. • Dowiązanie symboliczne może wskazywać na plik istniejący, lub nie istniejący. • Prawa dostępu dla dowiązania symbolicznego są nieistotne.

  30. Informacje o plikach • Pliki • Podstawowe operacje na plikach • Pliki w środowisku wielu użytkowników • Pliki z wieloma nazwami • Informacje o plikach • Katalogi • Potoki

  31. Informacje o plikach stat (1/2) • int stat(const char *file_name, struct stat *buf); • Funkcje te zwracają informacje o podanym pliku. Do uzyskania tej informacji nie są wymagane prawa dostępu do samego pliku.

  32. Informacje o plikach stat, fstat (2/2) struct stat { dev_t st_dev; /* ID urządzenia zawierającego plik */ ino_t st_ino; /* numer i-węzła (inode) */ umode_t st_mode; /* ochrona */ nlink_t st_nlink; /* liczba dowiązań stałych */ uid_t st_uid; /* ID użytkownika właściciela */ gid_t st_gid; /* ID grupy właściciela */ dev_t st_rdev; /* ID urządzenia (plik specjalny) */ off_t st_size; /* całkowity rozmiar w bajtach */ blksize_t st_blksize; /* rozmiar bloku dla I/O systemu plików */ blkcnt_t st_blocks; /* liczba zaalokowanych bloków */ time_t st_atime; /* czas ostatniego dostępu */ time_t st_mtime; /* czas ostatniej modyfikacji */ time_t st_ctime; /* czas ostatniej zmiany */ };

  33. Katalogi • Pliki • Katalogi • Implementacja katalogu • Podstawowe operacje na katalogach • Potoki

  34. Implementacja katalogu • Pliki • Katalogi • Implementacja katalogu • Podstawowe operacje na katalogach • Potoki

  35. Implementacja katalogu „UNIX. Programowanie systemowe” K.Haviland

  36. Podstawowe operacje na katalogach • Pliki • Katalogi • Implementacja katalogu • Podstawowe operacje na katalogach • Potoki

  37. Tworzenie i usuwanie katalogów • int mkdir(const char *pathname, mode_t mode); • Funkcja próbuje stworzyć katalog o nazwie pathname z prawami dostępu zgodnymi z mode i aktualną maską umask. • int rmdir(const char *pathname); • Funkcja próbuje usunąć pusty katalog pathname.

  38. Otwieranie i zamykanie katalogów • DIR *opendir(const char *name); • Funkcja otwiera strumień katalogu name i zwraca wskaźnik do tego strumienia, ustawiając go jednocześnie na pierwszym wpisie w katalogu. W przypadku błędu zwracany jest NULL. • int closedir(DIR *dir); • Funkcja zamyka strumień katalogu wskazanego przez dir.

  39. Czytanie katalogów • struct dirent *readdir( DIR *dir); • Funkcja zwraca wskaźnik do struktury dirent zawierającej informacje o kolejnym wpisie w strumieniu katalogu dir. Jeżeli osiągnięto koniec pliku lub pojawił się błąd to zwracany jest NULL. struct dirent { ino_td_ino; /* inode number */ off_t d_off; /* offset to the next dirent */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file */ char d_name[256]; /* filename */ }; • void rewinddir(DIR *dir); • Funkcja ustawia wskaźnik pozycji w strumieniu katalogu na pierwszy element. telldir, scandir, seekdir

  40. Zmiana bieżącego katalogu roboczego chdir • int chdir(const char *path); • int fchdir( int fd); • chdirzmienia katalog bieżący na katalog podany w path. • fchdirjest identyczne jak chdir, lecz katalog jest podawany jako deskryptor otwartego pliku.

  41. Przechodzenie drzewa katalogów ftw • int ftw(const char *dirpath, int (*fn) (const char *fpath, const struct stat *sb, int typeflag), int nopenfd); • Funkcja przechodzi przez drzewo katalogów, którego korzeniem jest dirpath i dla każdego odnalezionego wpisu wywołuje funkcję użytkownika fn. • Domyślnie pierwsze obsługiwane są katalogi, następnie pliki i podkatalogi (preorder). • Do każdego wywołania fnprzekazywane są argumenty: • fpath – ścieżka do wpisu względem dirpath, • sb – wskaźnik do struktur stat z informacjami o wpisie, • typeflag– typ wpisu, np. FT_F, FT_D, FT_DNR. nftw

  42. Potoki • Pliki • Katalogi • Potoki • Nienazwane • Nazwane

  43. Potoki • Mechanizm komunikacji międzyprocesowej oparty na plikach specjalnych: • potoki nienazwane – specjalne i-węzły, bez nazw w systemie plików, dostępne jedynie dla procesów potomnych procesu tworzącego potok. • potoki nazwane – mają nazwę w systemie plików, dostępne dla dowolnych procesów.

  44. Potoki nienazwane • Pliki • Katalogi • Potoki • Nienazwane • Nazwane

  45. Funkcja pipe • int pipe( int filedes[2]); • Funkcja tworzy parę sprzężonych deskryptorów pliku, wskazujących na i-węzeł potoku i umieszcza je w tablicy wskazywanej przez filedes. • filedes[0] jest dla odczytu, a filedes[1] dla zapisu. • Zmiana trybu blokujący/nieblokujący za pomocą fcntl.

  46. Przykład komunikacji jednokierunkowej

  47. Potoki nazwane • Pliki • Katalogi • Potoki • Nienazwane • Nazwane

  48. Funkcja mkfifo • int mkfifo( const char *pathname, mode_t mode); • Funkcja tworzy plik specjalny FIFO o nazwie pathname i prawach dostępu zależnych od modei maski umask. • Otwieranie funkcją open blokujące (domyślnie) lub nieblokujące (O_NONBLOCK). Flaga O_NONBLOCK ma wpływ na działanie open, read i write.

  49. Przykład komunikacji jednokierunkowej

More Related