deskryptor pliku a nazwa pliku

12

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/stdini /proc/self/fd/0są wszystkie linki do /dev/pts/2. Czy te cztery deskryptory plików lub nazwy plików?

Tim
źródło
stackoverflow.com/questions/33495283/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

12

Wszystkie cztery /dev/fd/0, /dev/stdin, /proc/self/fd/0a /dev/pts/2nazwy 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/shJest równoważne z (zakładając ///bin/sh, /bin/../bin/shże /binjest 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 przez pipe) i gniazda sieciowe .

/dev/fd/0, /dev/stdinA /proc/self/fd/0nazwy 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łaniem dup(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.

Gilles „SO- przestań być zły”
źródło
@Giles Napisałeś: „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.” ( Moje podkreślenie ). O ile rozumiem, jest to tylko liczba całkowita taka jak standardowa 0,1,2 itd. Odpowiednio dla stdin, stdout i stderr. Byłoby to wartości o wyższej wartości dla zwykłych plików. Z twojego komentarza nie wynika, że ​​liczba ta wskazuje „co zrobić, jeśli proces zażąda odczytu, zapisu i innych operacji na deskryptorze pliku”. . Czy możesz to trochę rozwinąć?
Geek
@Geek Wpis w tabeli deskryptorów plików nie jest liczbą. Liczba jest indeksem w tej tabeli.
Gilles „SO- przestań być zły”
@Giles dziękuje za wyjaśnienie mojego nieporozumienia. Teraz to rozumiem lepiej. Czy możesz więc podać przykład odpowiedzi „co robić”? Zrozumiałem, że każdy wpis w tabeli deskryptorów plików ponownie ma wskaźnik do tabeli plików, która zawiera takie informacje, jak przesunięcie pliku, status pliku itp. Jednak nadal nie jestem pewien, co należy zrobić w odpowiedzi.
Geek
2

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.

Na przykład wszystkie / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 są linkami do / dev / pts / 2. Czy te cztery deskryptory plików lub nazwy plików?

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.

RVS
źródło