„Postać na raz” jest mylącą nazwą (podobnie jak idea, że urządzenia postaci niekoniecznie obsługują wyszukiwanie i mówienie). W rzeczywistości urządzenia „blokuj na raz” (tj. Urządzenia ściśle zorientowane na zapis, takie jak napęd taśmowy *) muszą być urządzeniami znakowymi. Podobnie jest z ideą, że urządzenie znakowe musi koniecznie być niewidzialne - sterowniki urządzeń znakowych definiują pełną file_operations
strukturę, która może dowolnie definiować lseek, czy nie, zależnie od tego, czy urządzenie obsługuje tę operację. Urządzenia postaci, które większość ludzi uważa za przykłady, to null, urandom, urządzenia TTY, karta dźwiękowa, mysz itp. i / dev / kmem są również urządzeniami postaci i wszystkie są widoczne.
Jak wspomniałem, sterownik urządzenia znakowego definiuje strukturę operacji file_operation, która ma wskaźniki funkcji dla wszystkich operacji, które ktoś może chcieć wywołać dla pliku - szukaj, czytaj, pisz, ioctl itp. - i każda z nich jest wywoływana raz, gdy odpowiednie wywołanie systemowe jest wykonywany przy otwartym pliku urządzenia. A zatem czytanie i pisanie może w ten sposób robić wszystko, co chce dzięki swoim argumentom - może odmówić przyjęcia zapisu, który jest zbyt duży lub pisać tylko to, co pasuje; może odczytać tylko dane odpowiadające jednemu rekordowi, a nie całej żądanej liczby bajtów.
Czym więc jest urządzenie blokowe? Zasadniczo urządzenia blokowe są dyskami. Żadne inne urządzenie (z wyjątkiem wirtualnych napędów dyskowych, takich jak ramdysk i pętla zwrotna) nie jest urządzeniem blokowym. Są one zintegrowane z systemem żądania we / wy, warstwą systemu plików, systemem bufora / pamięci podręcznej i systemem pamięci wirtualnej w sposób, w jaki nie są używane urządzenia znakowe, nawet gdy uzyskujesz dostęp np. / Dev / sda z procesu użytkownika . Nawet „surowe urządzenia”, o których strona wspomina jako wyjątek, są urządzeniami znakowymi .
* Niektóre systemy UNIX zaimplementowały tak zwany „tryb stałego bloku” - który pozwala grupom jądra i podzielonym żądaniom We / Wy dopasować skonfigurowane granice bloków mniej więcej tak samo, jak w przypadku napędów dyskowych - jako blok urządzenie. Urządzenie znakowe jest potrzebne do „trybu zmiennych bloków”, który zachowuje granice bloków z programu użytkownika, ponieważ pojedyncze wywołanie write (2) zapisuje jeden blok, a pojedyncze wywołanie read (2) zwraca jeden blok. Ponieważ przełączanie trybów jest teraz realizowane jako ioctl, a nie jako osobny plik urządzenia, używane jest urządzenie znakowe. Napędy taśmowe o zmiennych rekordach są w większości „niewidzialne”, ponieważ wyszukiwanie wymaga zliczenia liczby rekordów, a nie liczby bajtów, a natywna operacja wyszukiwania jest zaimplementowana jako ioctl.