Zastanawiałem się, jakie są różnice i relacje między deskryptorami plików a nazwami plików. Czy wszystkie służą do uzyskiwania dostępu do plików? Jeśli tak, w ten sam sposób?
Na przykład /dev/fd/0
, /dev/stdin
i /proc/self/fd/0
są wszystkie linki do /dev/pts/2
. Czy te cztery deskryptory plików lub nazwy plików?
Odpowiedzi:
Wszystkie cztery
/dev/fd/0
,/dev/stdin
,/proc/self/fd/0
a/dev/pts/2
nazwy plików, jak są/////dev/../dev/fd//0
,/bin/sh
,/etc/fstab
,/fioejfoeijf
, itd. Wszystkie jednak, że ostatni przykład mogą być nazwą istniejącego pliku na komputerze. Nazwa pliku to ciąg znaków, który może oznaczać plik w systemie plików; pod Linuksem każdy ciąg znaków, który nie zawiera bajtu zerowego i ma maksymalnie 4096 bajtów, jest prawidłową nazwą pliku. Wiele z tych nazw jest równoważnych, np./bin/sh
Jest równoważne z (zakładając///bin/sh
,/bin/../bin/sh
że/bin
jest to istniejący katalog) itp. Wszystkie przykłady, które do tej pory podałem, to bezwzględne nazwy plików; istnieją także względne nazwy plików, które nie zaczynają się od a,/
a ich znaczenie zależy od bieżącego katalogu.Terminologia dotycząca nazw plików nie jest uniwersalna; czasami „nazwa pliku” oznacza pełną ścieżkę do pliku, a czasami oznacza nazwę pozycji katalogu. Terminologia POSIX to „ nazwa pliku ” lub „ składnik nazwy ścieżki ” dla nazwy pozycji katalogu i „ nazwa ścieżki ” dla pełnej ścieżki.
Deskryptor pliku oznacza otwarty plik w określonym procesie. Jądro utrzymuje tabelę deskryptorów plików dla każdego procesu. Każdy wpis w tabeli deskryptorów plików wskazuje, co zrobić, jeśli proces zażąda odczytu, zapisu i innych operacji na deskryptorze pliku.
Deskryptory plików mogą odpowiadać plikowi i mieć powiązaną nazwę, ale nie wszystkie. Dla tych, którzy to robią, plik może być zwykłym plikiem, katalogiem, plikiem urządzenia lub nazwanym potokiem (zwanym także FIFO) (rodzaj utworzony przez
mkfifo
); niektóre systemy mają dalsze możliwości, takie jak gniazda i drzwi unix. Przykłady deskryptorów plików, które nie mają skojarzonych nazwanych plików, to potoki (takie, które zostały utworzone przezpipe
) i gniazda sieciowe ./dev/fd/0
,/dev/stdin
A/proc/self/fd/0
nazwy plików (wszystkie równorzędne) o znaczeniu osobliwego: wszyscy desygnowany dowolny plik jest obecnie dostępna za pośrednictwem pliku deskryptora 0. Kiedy proces otwiera je kopiuje jądra wpis z indeksem 0 w tabeli deskryptorów deskryptora pliku do nowego deskryptor. Otwarcie dowolnego z tych plików jest równoznaczne z wywołaniemdup(0)
. Nazwane pliki są sposobem na pośrednie uzyskanie procesu korzystania z jednego z już otwartych plików zamiast otwierania nowego pliku; najczęściej przydają się w wierszu poleceń programu, w którym program oczekuje, że nazwa pliku się otworzy.źródło
Nazwa pliku to tylko nazwa pliku w systemie plików, nic więcej - to tylko ciąg znaków.
Deskryptor pliku jest rodzajem obiektu, z którego można czytać i / lub pisać. To jest otwarty i gotowy plik. Są nie tylko deskryptory plików - stdin, stdout i stderr są również deskryptorami, możesz pisać i odczytywać je przy użyciu absolutnie takich samych funkcji jak w przypadku plików (z tym wyjątkiem, że nie możesz na przykład szukać). Inne przykłady deskryptorów, które nie są plikami, to: nazwane potoki i gniazda sieciowe.
W kodzie deskryptor pliku jest zmienną, wskaźnikiem do czegoś w jądrze, który reprezentuje obiekt pliku.
Są to pseudopliki, które mogą być przydatne w niektórych skryptach lub programach. Możesz je otworzyć, a open () zwróci Ci deskryptor pliku.
źródło