Na wielu urządzeniach głównymi operacjami są wysyłanie bajtów z komputera na urządzenie peryferyjne lub odbieranie bajtów z urządzenia peryferyjnego na komputerze. Takie urządzenia są podobne do potoków i działają dobrze jako urządzenia postaci . W przypadku operacji, które nie odczytują i nie zapisują (takich jak kontrola przepływu na linii szeregowej), urządzenie udostępnia polecenia ad-hoc o nazwie ioctl .
Niektóre urządzenia są bardzo podobne do zwykłych plików: składają się ze skończonej liczby bajtów, a to, co piszesz w danej pozycji, można później odczytać z tej samej pozycji. Urządzenia te nazywane są urządzeniami blokowymi .
Interfejsy sieciowe są bardziej złożone: to, co odczytują i zapisują, to nie bajty, ale pakiety. Chociaż nadal byłoby możliwe użycie zwykłego interfejsu z, read
i write
byłoby to niezręczne: przypuszczalnie każde wywołanie do write
wysłałoby pakiet, a każde wywołanie do read
odebrałoby pakiet (a jeśli bufor jest zbyt mały, aby pomieścić pakiet, pakiet zostanie utracony).
Interfejsy sieciowe mogą istnieć wyłącznie jako urządzenia ioctl
. W rzeczywistości robią to niektóre warianty unixowe, ale nie Linux. Takie podejście ma pewną zaletę; na przykład w systemie Linux interfejsy sieciowe mogą wykorzystywać udev . Ale zalety są ograniczone, dlatego nie zostało to zrobione.
Większość aplikacji sieciowych nie dba o poszczególne interfejsy sieciowe, działają one na wyższym poziomie. Na przykład przeglądarka internetowa chce nawiązywać połączenia TCP, a serwer sieciowy chce nasłuchiwać połączeń TCP. W tym celu przydatne byłyby urządzenia do protokołów sieciowych wysokiego poziomu, np
{ echo $'GET http://www.google.com/ HTTP/1.0\r';
echo $'Host: www.google.com\r';
echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80
W rzeczywistości ksh i bash zapewniają taki interfejs dla klientów TCP i UDP. Ogólnie jednak aplikacje sieciowe są bardziej złożone niż aplikacje z dostępem do plików. Podczas gdy większość wymiany danych odbywa się przy użyciu połączeń analogicznych do read
i write
, nawiązanie połączenia wymaga więcej informacji niż tylko nazwy pliku. Na przykład nasłuchiwanie połączeń TCP wymaga dwóch kroków: jednego do wykonania, gdy serwer zaczyna nasłuchiwać, i drugiego do wykonania przy każdym połączeniu klienta. Takie dodatkowe kroki nie pasują dobrze do interfejsu API pliku, co jest głównym powodem, dla którego sieć ma swój własny interfejs API.
Inną klasą urządzeń, które zwykle nie mają wpisów w /dev
Linuksie (ale w niektórych innych wariantach unixowych) są karty wideo. Zasadniczo proste karty wideo mogą być widoczne jako urządzenia buforujące ramki , które mogą być urządzeniami blokowymi wykonanymi z bloków reprezentujących kolor każdego piksela. Przyspieszone karty wideo mogą być reprezentowane jako urządzenia znakowe, na które aplikacje wysyłają polecenia. Wadą interfejsu urządzenia jest to, że działa wolno: aplikacja wyświetlająca (w praktyce serwer X) będzie musiała wykonywać wywołania jądra za każdym razem, gdy cokolwiek wyświetla. Zamiast tego serwer X zapisuje głównie bezpośrednio w pamięci karty wideo, ponieważ jest szybszy.