Zrozumienie / dev oraz jego podkatalogów i plików


52
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Zastanawiałem się, czy wszystkie pliki /devi podkatalogi są deskryptorami plików urządzeń?
  2. Dlaczego jest tyle linków od siebie? Na przykład /dev/fd/0, /dev/stdin, /proc/self/fd/0są wszystkie linki do /dev/pts/2.
  3. Jeśli lw lrwx------średnim łącza, co ma cna crw--w---- myśli?

3
Aby odpowiedzieć # 3, c oznacza urządzenie postaci lub znak specjalny . b oznacza blok specjalny .
felixphew

Odpowiedzi:


78

Prawie wszystkie pliki poniżej /devto pliki urządzeń . Podczas gdy odczyt i zapis do zwykłego pliku przechowują dane na dysku lub innym systemie plików, dostęp do pliku urządzenia komunikuje się ze sterownikiem w jądrze, który generalnie z kolei komunikuje się ze sprzętem (urządzenie, stąd nazwa).

Istnieją dwa typy plików urządzeń: urządzenia blokowe (oznaczone bjako pierwszy znak na wyjściu ls -l) i urządzenia znakowe (oznaczone przez c). Rozróżnienie między urządzeniami blokowymi i znakowymi nie jest całkowicie uniwersalne. Urządzenia blokowe to takie dyski, które zachowują się jak duże pliki o stałym rozmiarze: jeśli zapisujesz bajt z pewnym przesunięciem, a później odczytujesz urządzenie z tym przesunięciem, odzyskujesz ten bajt. Urządzenia znakowe są czymkolwiek innym, gdzie zapisanie bajtu ma natychmiastowy efekt (np. Jest emitowany na linii szeregowej), a odczyt bajtu ma również natychmiastowy efekt (np. Odczyt z portu szeregowego).

Znaczenie pliku urządzenia zależy od jego numeru, a nie nazwy (nazwa ma znaczenie dla aplikacji, ale nie dla jądra). Liczba to tak naprawdę dwie liczby: większa liczba wskazuje, który sterownik jest odpowiedzialny za to urządzenie, a podrzędny numer pozwala kierowcy sterować kilkoma urządzeniami¹. Liczby te pojawiają się na ls -lliście, gdzie zwykle znajduje się rozmiar pliku. Np. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ to urządzenie ma major 8, minor 0.

Niektóre pliki urządzeń poniżej /devnie odpowiadają urządzeniom. Jednym z nich jest każdy system uniksowy /dev/null; zapisywanie do niego nie ma żadnego efektu, a czytanie z niego nigdy nie zwraca żadnych danych. Jest to często wygodne w skryptach powłoki, gdy chcesz zignorować dane wyjściowe polecenia ( >/dev/null) lub uruchomić polecenie bez wprowadzania danych ( </dev/null). Inne typowe przykłady to /dev/zero(które zwraca null bajty ad infinitum ) /dev/urandom(które zwraca losowe bajty ad infinitum ).

Kilka plików urządzeń ma znaczenie, które zależy od procesu, który uzyskuje do nich dostęp. Na przykład /dev/stdinwyznacza standardowe wejście bieżącego procesu; otwarcie z ma w przybliżeniu taki sam efekt jak otwarcie oryginalnego pliku, który został otwarty jako standardowe wejście procesu. W podobny sposób /dev/ttyoznacza terminal, z którym proces jest połączony. Pod Linuksem współcześnie /dev/stdinprzyjaciele i przyjaciele nie są implementowani jako urządzenia postaci, ale zamiast tego jako dowiązania symboliczne do bardziej ogólnego mechanizmu, który pozwala na odwołanie się do każdego deskryptora pliku (w przeciwieństwie do 0, 1 i 2 w tradycyjnej metodzie); na przykład /dev/stdinjest dowiązaniem symbolicznym do /proc/self/fd/0. Zobacz Jak odnosi się / dev / fd do / proc / self / fd /? .

Znajdziesz kilka symbolicznych linków pod /dev. Może się to zdarzyć z przyczyn historycznych: plik urządzenia został przeniesiony z jednej nazwy na drugą, ale niektóre aplikacje nadal używają starej nazwy. Na przykład /dev/scd0jest dowiązaniem symbolicznym do /dev/sr0systemu Linux; oba oznaczają pierwsze urządzenie CD. Innym powodem, dla łączy symbolicznych jest organizacja: pod Linuksem, znajdziesz dysków twardych i partycji w kilku miejscach: /dev/sdai /dev/sda1i przyjaciele (każdy dysk oznaczony literą, arbitralny i przegrody zgodnie z układem partycji), /dev/disk/by-id/*(dyski oznaczone przez niepowtarzalny numer seryjny) /dev/disk/by-label/*(partycje z systemem plików, oznaczone etykietą wybraną przez człowieka); i więcej. Łącza symboliczne są również używane, gdy ogólna nazwa urządzenia może być jedną z kilku; na przykład/dev/dvdmoże to być symboliczny link do /dev/sr0, lub może to być link do, /dev/sr1jeśli masz dwa czytniki CD, a drugi ma być domyślnym czytnikiem DVD.

Na koniec istnieje kilka innych plików, które możesz znaleźć /devz tradycyjnych powodów. Nie znajdziesz tego samego w każdym systemie. W większości jednorożców /dev/logjest gniazdem używanym przez programy do wysyłania komunikatów dziennika. /dev/MAKEDEVto skrypt, który tworzy wpisy w /dev. W nowoczesnych systemach Linux wpisy w /dev/są tworzone automatycznie przez udev , przestarzałe MAKEDEV.

¹ W rzeczywistości nie jest to prawdą w Linuksie, ale ten szczegół ma znaczenie tylko dla autorów sterowników urządzeń.


Dzięki! Przez „znaczenie pliku urządzenia zależy od jego numeru”, czy masz na myśli jego deskryptor pliku?
Tim

@Tim: Nie, liczby pojawiają się na ls -lliście, gdzie zwykle znajduje się rozmiar pliku, przed datą, np. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ to urządzenie ma 8 lub mniejszy numer 0. Numery urządzeń nie pojawiają się często w praktyce, wspomniałem o nich co czyni urządzenie urządzeniem (co najważniejsze, nie jest to nazwa pliku). Numer deskryptora pliku ma znaczenie tylko w określonym procesie.
Gilles „SO- przestań być zły”,

Nie, otwarcie /dev/stdin(=> /proc/self/fd/0) w systemie Linux nie ma tego samego efektu, co powielenie standardowego wejścia. Aby zobaczyć różnicę su - non_root_user, a następnie exec 5</dev/stdinzakończy się niepowodzeniem z „Permission denied”, ale exec 5<&0uda. I to nie tylko, że nowy fd zostanie otwarty z różnymi flagami, wszystko o obiektu pliku ( „descrip Otwórz plik cji ” w żargonie POSIX) będzie inny (wskaźnik pliku offset, non / tryb blokowania, itp).
mosvy

14
  1. Tak - bezpośrednio lub jako dowiązania symboliczne - po to /dev/jest.
  2. Do różnych celów: czasami dla zgodności między schematami nazewnictwa, czasem jest to konieczne dla środowiska pracy - jak na przykład /dev/stdin. Ten sposób nie wskazują statycznie do /dev/pts/2lub jakakolwiek inna - wystarczy przełączyć się na inny terminal, a zobaczysz. /dev/stdinjest standardowym wejściem bieżącej sesji terminala. To także przykład, dlaczego musi to być dowiązanie symboliczne.
  3. Zobacz man mknodi info coreutils 'mknod invocation'. Zasadniczo coznacza typ urządzenia chararacter.

3
„standardowe wejście bieżącej sesji terminala” jest nieco niejednoznaczne. /dev/stdinodnosi się do standardowego wejścia procesu, który go otworzy. Wszystko w tym /proc/$pidjest danymi zależnymi od procesu i /proc/selfjest rodzajem magicznego dowiązania symbolicznego do własnych danych procesu.
Stéphane Gimenez

11

W przypadku pierwszego pytania nie są to deskryptory plików, lecz pliki urządzeń. (alias „dev nodes”)

Pliki te są powiązane ze sterownikiem obsługującym urządzenie przy użyciu głównych i mniejszych liczb. (Na przykład „136, 2” w danych lswyjściowych odnosi się do sterownika urządzenia powiązanego z liczbą główną 136 i określa urządzenie nr 2 obsługiwane przez ten sterownik.)

Pierwsza litera wyniku ls -lto typ urządzenia w przypadku plików urządzeń. Jeśli jest to „c”, to jest to urządzenie znakowe lub jeśli jest to „b”, to jest to urządzenie blokowe.

Na drugie pytanie patrz powyższa odpowiedź rozcietrzewiacz.


1
Link „Wprowadzenie do sterowników urządzeń” wydaje się być uszkodzony.
Slothworks,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.