IOCTL(2) Manuel du programmeur Linux IOCTL(2)

ioctl - Contrôler les périphériques

#include <sys/ioctl.h>

int ioctl(int fd, unsigned long request, ...);

L'appel système ioctl() modifie le comportement des périphériques sous‐jacents des fichiers spéciaux. En particulier, de nombreuses caractéristiques des fichiers spéciaux en mode caractère (par exemple des terminaux) peuvent être contrôlées avec des requêtes ioctl(). L'argument d doit être un descripteur de fichier ouvert.

Le second argument est le code de la requête dépendant du périphérique. Le troisième argument est un pointeur non typé. Il est traditionnellement défini en char *argp (cela date de l'époque avant que void * soit du C valide), et sera ainsi nommé dans le reste de cette page.

Une requête ioctl() encapsule le fait que l'argument est un paramètre d'entrée ou de sortie ainsi que la taille de l'argument argp en octets. Les macros et constantes symboliques décrivant les requêtes ioctl() se trouvent dans le fichier <sys/ioctl.h>. Voir NOTES.

En général, ioctl renvoie 0 s'il réussit, ou -1 s'il échoue. Certaines requêtes ioctl utilisent la valeur de retour comme paramètre de sortie, et renvoient une valeur positive si elles réussissent (et -1 pour les erreurs). En cas d'échec, errno contient le code d'erreur.

EBADF
fd n'est pas un descripteur de fichier valable.
EFAULT
argp pointe en dehors de l'espace d'adressage valide.
EINVAL
La requête ou l'argument argp n'est pas valide.
ENOTTY
fd n'est pas associé avec un fichier spécial en mode caractère.
ENOTTY
La requête indiquée ne s'applique pas au type d'objet associé avec le descripteur fd.

Pas de standard unique. Les arguments, les valeurs de retour, et la sémantique de ioctl() varient en fonction du périphérique concerné (cet appel système est utilisé pour encapsuler les opérations qui ne se conforment pas bien au modèle UNIX des entrées/sorties par flux).

L'appel système ioctl() est apparu dans l'UNIX d'AT&T Version 7.

Pour utiliser cet appel, on a besoin d'un descripteur de fichier ouvert. Souvent, l'appel open(2) a des effets de bord non désirés, qui peuvent être évités sous Linux en lui passant le drapeau O_NONBLOCK.

Les valeurs de la commande Ioctl sont des constantes 32 bits. En principe, ces constantes sont totalement abritraires, mais les gens essaient de les structurer.

Avant, sous Linux, on avait principalement des constantes 16 bits, où le dernier octet est un numéro de série et celui/ceux précédent(s) donnent un type indiquant le pilote. Parfois, le nombre majeur était utilisé : 0x03 pour les ioctls HDIO_*, 0x06 pour les ioctls LP*. Et parfois, une ou plusieurs lettres ASCII étaient utilisées. Par exemple, TCGETS a une valeur de 0x00005401, avec 0x54 = 'T' indiquant le pilote du terminal, et CYGETTIMEOUT avait une valeur de 0x00435906, avec 0x43 0x59 = 'C' 'Y' indiquant le pilote des cyclades.

Plus tard (0.98p5), des informations supplémentaires ont été construites dans le numéro. L'une a deux bits de direction (00 : aucun, 01 : écriture, 10 : lecutre, 11 : lecture/écriture), suivi de bits de taille 14 (donnant la taille de l'argument), suivi d'un autre de type 8 bits (récupérant les ioctls dans des groupes généralistes ou des pilotes communs) et un numéro de série 8 bits.

Les macros décrivant cette structure se trouvent dans <asm/ioctl.h>, il s'agit de _IO(type,nr) et {_IOR,_IOW,_IOWR}(type,nr,size). Elles utilisent sizeof(size), donc la taille est ici un « misnomer » : ce troisième argument est de type donnée.

Notez que les bits de taille ne sont pas fiables du tout : dans de nombreux cas, ils sont faux, soit du fait de macros buguées qui utilisent sizeof(sizeof(struct)), soit à cause de valeurs primitives.

Ainsi, il semble que cette nouvelle structure ne procure que des inconvénients : elle n'aide pas à faire des vérifications mais provoque une variation de valeurs sur les différentes architectures.

execve(2), fcntl(2), ioctl_console(2), ioctl_fat(2), ioctl_ficlonerange(2), ioctl_fideduperange(2), ioctl_fslabel(2), ioctl_getfsmap(2), ioctl_iflags(2), ioctl_ns(2), ioctl_tty(2), ioctl_userfaultfd(2), open(2), sd(4), tty(4)

Cette page fait partie de la publication 5.10 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

La traduction française de cette page de manuel a été créée par Christophe Blaess https://www.blaess.fr/christophe/, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.

11 avril 2020 Linux