ioctl - Contrôler les périphériques
Bibliothèque C standard (
libc,
-lc)
#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.
Certaines requêtes
ioctl utilisent la valeur de retour comme
paramètre de sortie, et renvoient une valeur positive si elles
réussissent. En cas d'échec,
-1 est renvoyé et
errno est positionné pour indiquer l'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_ficlone(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)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Philippe MENGUAL <
[email protected]>
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 à
[email protected]