Sur de nombreux périphériques, les opérations principales consistent à envoyer des octets de l'ordinateur à un périphérique ou à recevoir des octets d'un périphérique de l'ordinateur. De tels dispositifs sont similaires aux pipes et fonctionnent bien en tant que dispositifs pour les personnages . Pour les opérations qui ne lisent et n'écrivent pas (comme le contrôle de flux sur une ligne série), le périphérique fournit des commandes ad-hoc appelées ioctl .
Certains périphériques ressemblent beaucoup à des fichiers normaux: ils sont composés d’un nombre fini d’octets et ce que vous écrivez à une position donnée peut ensuite être lu à partir de la même position. Ces périphériques sont appelés des périphériques en mode bloc .
Les interfaces réseau sont plus complexes: ce qu’elles lisent et écrivent n’est pas des octets mais des paquets. Même s’il serait toujours possible d’utiliser l’interface habituelle avec read
et write
, ce serait gênant: chaque appel à write
envoyer un paquet, et chaque appel à read
recevoir un paquet (et si le tampon est trop petit pour tenir dans le paquet, le paquet serait perdu).
Les interfaces réseau peuvent exister en tant que périphériques fournissant uniquement ioctl
. En fait, c'est ce que font certaines variantes Unix, mais pas Linux. Cette approche présente certains avantages. par exemple, sous Linux, les interfaces réseau pourraient exploiter udev . Mais les avantages sont limités, c'est pourquoi cela n'a pas été fait.
La plupart des applications liées au réseau ne se soucient pas des interfaces réseau individuelles, elles travaillent à un niveau supérieur. Par exemple, un navigateur Web souhaite établir des connexions TCP et un serveur Web souhaite écouter les connexions TCP. Pour ce faire, il serait utile de disposer de périphériques pour les protocoles réseau de haut niveau, par exemple:
{ 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
En fait, ksh et bash fournissent une telle interface pour les clients TCP et UDP. En général, toutefois, les applications réseau sont plus complexes que les applications d’accès aux fichiers. Alors que la plupart des échanges de données sont effectués avec des appels analogues à read
et write
, l'établissement de la connexion nécessite plus d'informations qu'un simple nom de fichier. Par exemple, l'écoute de connexions TCP nécessite deux étapes: une à exécuter lorsque le serveur commence à écouter et une à effectuer à chaque fois qu'un client se connecte. De telles étapes supplémentaires ne s'intègrent pas bien dans l'API de fichier. C'est la raison principale pour laquelle la mise en réseau a sa propre API.
Les /dev
adaptateurs vidéo sont une autre classe de périphériques qui ne possèdent généralement pas d'entrées sous Linux (mais sur d'autres variantes unix). En principe, de simples adaptateurs vidéo pourraient être exposés en tant que dispositifs de tampon de trame , qui pourraient être des dispositifs de blocage constitués de blocs représentant la couleur de chaque pixel. Les cartes vidéo accélérées peuvent être représentées comme des périphériques de caractères sur lesquels les applications envoient des commandes. Ici, l’inconvénient de l’interface de périphérique est sa lenteur: l’application qui affiche (en pratique, un serveur X) aurait besoin d’appeler le noyau chaque fois qu’elle affiche quelque chose. Au lieu de cela, le serveur X écrit la plupart du temps directement dans la mémoire de la carte vidéo, car elle est plus rapide.