"Character at a time" ist eine falsche Bezeichnung (ebenso wie die Vorstellung, dass Zeichengeräte das Suchen und Erkennen nicht unbedingt unterstützen). In der Tat, „Block zu einer Zeit“ (also streng satzorientierte, wie beispielsweise ein Bandlaufwerk *) Geräte müssen Zeichenvorrichtungen sein. Die Idee ist also, dass ein Zeichengerät unbedingt nicht suchbar sein muss - Zeichengerätetreiber definieren eine vollständige file_operations
Struktur, die frei definiert werden kann, je nachdem, ob das Gerät die Operation unterstützt oder nicht. Die Zeichengeräte, die die meisten Leute als Beispiele ansehen, sind null, urandom, TTY-Geräte, Soundkarten, Mäuse usw., die alle aufgrund der Besonderheiten dieser Geräte nicht zu finden sind, aber / dev / vcs, / dev / fb0 , und / dev / kmem sind ebenfalls Zeichengeräte und können gesucht werden.
Wie bereits erwähnt, definiert ein Zeichengerätetreiber eine file_operations-Struktur, die Funktionszeiger für alle Vorgänge enthält, die für eine Datei ausgeführt werden sollen (Suchen, Lesen, Schreiben, Ioctl usw.). Diese werden jeweils beim entsprechenden Systemaufruf einmal aufgerufen wird bei geöffneter Gerätedatei ausgeführt. Und Lesen und Schreiben kann daher mit seinen Argumenten tun, was immer es will - es kann sich weigern, ein zu großes Schreiben zu akzeptieren oder nur das zu schreiben, was passt; Es kann nur die Daten lesen, die einem Datensatz entsprechen, und nicht die gesamte angeforderte Anzahl von Bytes.
Was ist also ein Blockgerät? Blockgeräte sind grundsätzlich Festplatten. Keine andere Art von Gerät (mit Ausnahme von virtuellen Laufwerken wie Ramdisk und Loopback) ist ein Blockgerät. Sie sind in das E / A-Anforderungssystem, die Dateisystemschicht, das Puffer- / Cache-System und das virtuelle Speichersystem so integriert, wie es Zeichengeräte nicht tun , selbst wenn Sie von einem Benutzerprozess aus auf z. B. / dev / sda zugreifen . Sogar die "Raw-Geräte", die auf dieser Seite als Ausnahme erwähnt werden, sind Zeichengeräte .
* Einige UNIX-Systeme implementierten den sogenannten "Fixed-Block-Modus", mit dem die Kernel-Gruppen- und E / A-Anforderungen so aufgeteilt werden können, dass sie den konfigurierten Blockgrenzen in etwa wie bei Festplatten entsprechen - als Block Gerät. Für den "Variablen-Block-Modus" wird ein Zeichengerät benötigt, das die Blockgrenzen aus dem Anwenderprogramm beibehält, da ein einzelner Write (2) -Aufruf einen Block schreibt und ein einzelner Read (2) -Aufruf einen Block zurückgibt. Da die Modusumschaltung jetzt als ioctl und nicht als separate Gerätedatei implementiert ist, wird ein Zeichengerät verwendet. Bandlaufwerke mit variablen Datensätzen sind meistens "nicht suchbar", da das Suchen das Zählen einer Anzahl von Datensätzen anstelle einer Anzahl von Bytes umfasst und die native Suchoperation als ioctl implementiert ist.