$ 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
- Zastanawiałem się, czy wszystkie pliki
/dev
i podkatalogi są deskryptorami plików urządzeń?
- Dlaczego jest tyle linków od siebie? Na przykład
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
są wszystkie linki do /dev/pts/2
.
- Jeśli
l
w lrwx------
średnim łącza, co ma c
na crw--w----
myśli?
Odpowiedzi:
Prawie wszystkie pliki poniżej
/dev
to 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
b
jako pierwszy znak na wyjściuls -l
) i urządzenia znakowe (oznaczone przezc
). 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 -l
liś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
/dev
nie 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/stdin
wyznacza 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/tty
oznacza terminal, z którym proces jest połączony. Pod Linuksem współcześnie/dev/stdin
przyjaciele 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/stdin
jest 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/scd0
jest dowiązaniem symbolicznym do/dev/sr0
systemu 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/sda
i/dev/sda1
i 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/dvd
może to być symboliczny link do/dev/sr0
, lub może to być link do,/dev/sr1
jeś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źć
/dev
z tradycyjnych powodów. Nie znajdziesz tego samego w każdym systemie. W większości jednorożców/dev/log
jest gniazdem używanym przez programy do wysyłania komunikatów dziennika./dev/MAKEDEV
to skrypt, który tworzy wpisy w/dev
. W nowoczesnych systemach Linux wpisy w/dev/
są tworzone automatycznie przez udev , przestarzałeMAKEDEV
.¹ W rzeczywistości nie jest to prawdą w Linuksie, ale ten szczegół ma znaczenie tylko dla autorów sterowników urządzeń.
źródło
ls -l
liś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./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ępnieexec 5</dev/stdin
zakończy się niepowodzeniem z „Permission denied”, aleexec 5<&0
uda. 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)./dev/
jest./dev/stdin
. Ten sposób nie wskazują statycznie do/dev/pts/2
lub jakakolwiek inna - wystarczy przełączyć się na inny terminal, a zobaczysz./dev/stdin
jest standardowym wejściem bieżącej sesji terminala. To także przykład, dlaczego musi to być dowiązanie symboliczne.man mknod
iinfo coreutils 'mknod invocation'
. Zasadniczoc
oznacza typ urządzenia chararacter.źródło
/dev/stdin
odnosi się do standardowego wejścia procesu, który go otworzy. Wszystko w tym/proc/$pid
jest danymi zależnymi od procesu i/proc/self
jest rodzajem magicznego dowiązania symbolicznego do własnych danych procesu.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
ls
wyjś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 -l
to 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.
źródło