ioctl(2)

NUME
ioctl - controlează dispozitivul

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <sys/ioctl.h>

int ioctl(int fd, unsigned long op, ...);  /* glibc, BSD */
int ioctl(int fd, int op, ...);            /* musl, alte UNIX */

DESCRIERE
Apelul de sistem ioctl() manipulează parametrii de dispozitiv subiacente ai fișierelor speciale. În special, multe dintre caracteristicile de funcționare ale fișierelor speciale de caractere (de exemplu, terminale) pot fi controlate cu ajutorul operațiilor ioctl(). Argumentul fd trebuie să fie un descriptor de fișier deschis.

Al doilea argument este un cod de operație care depinde de dispozitiv. Cel de-al treilea argument este un indicator de memorie fără tip. În mod tradițional, este char *argp (din zilele de dinainte ca void * să fie valabil în C) și va fi numit astfel pentru această discuție.

O operație, „op” ioctl() are codificată în ea însăși dacă argumentul este un parametru de intrare sau un parametru de ieșire, precum și dimensiunea argumentului argp în octeți. Macrocomenzile și definițiile utilizate în specificarea unei cerer ioctl() sunt localizate în fișierul <sys/ioctl.h>. A se vedea NOTE.

VALOAREA RETURNATĂ
De obicei, în caz de succes, se returnează zero. Câteva operații ioctl() utilizează valoarea de returnare ca parametru de ieșire și returnează o valoare nenegativă în caz de succes. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EBADF
    descriptor-fișier nu este un descriptor de fișier valid.

EFAULT
    argp face referire la o zonă de memorie inaccesibilă.

EINVAL
    op (operația) sau argp nu sunt valide.

ENOTTY
    fd nu este asociat cu un dispozitiv special de caractere.

ENOTTY
    Operația specificată nu se aplică tipului de obiect la care face referire descriptorul de fișier fd.

VERSIUNI
Argumentele, returnările și semantica lui ioctl() variază în funcție de controlorul de dispozitiv în cauză (apelul este utilizat ca o soluție de tip „catch-all” (capturează-tot) pentru operațiile care nu se încadrează în mod clar în modelul fluxului de In/Ieș UNIX).

STANDARDE
Niciunul.

ISTORIC
AT&T UNIX versiunea 7 are
ioctl(int fildes, int op, struct sgttyb *argp);
(unde struct sgttyb a fost folosită istoric de stty(2) și gtty(2) și este polimorfă în funcție de tipul de operație (așa cum ar fi fost un void *, dacă ar fi fost disponibil)).

SysIII documentează arg fără niciun tip.

4.3BSD are
ioctl(int d, unsigned long op, char *argp);
(cu char * în mod similar cu void *).

SysVr4 are
int ioctl(int fildes, int op, ... /* arg */);

NOTE
Pentru a utiliza acest apel, este nevoie de un descriptor de fișier deschis. Adesea, apelul open(2) are efecte secundare nedorite, care pot fi evitate în Linux prin aplicarea fanionului O_NONBLOCK.

  structura ioctl
Valorile operației, „op” ioctl sunt constante pe 32 de biți. În principiu, aceste constante sunt complet arbitrare, dar oamenii au încercat să le construiască o anumită structură.

Vechea situație din Linux era cea a constantelor pe 16 biți, în care ultimul octet este un număr serial, iar octetul (octeții) precedent(i) oferă un tip care indică controlorul. Uneori se folosea numărul principal: 0x03 pentru ioctl-urile HDIO_*, 0x06 pentru ioctl-urile LP*. Iar uneori erau folosite una sau mai multe litere ASCII. De exemplu, TCGETS are valoarea 0x00005401, cu 0x54 = „T” indicând controlorul terminalului, iar CYGETTIMEOUT are valoarea 0x00435906, cu 0x43 0x59 = „C” „Y” indicând controlorul de „cyclades”.

Mai târziu (0.98p5), în număr au fost introduse mai multe informații. Unul are 2 biți de direcție (00: niciunul, 01: scriere, 10: citire, 11: citire/scriere), urmat de 14 biți de dimensiune (care dau dimensiunea argumentului), urmat de un tip pe 8 biți (care colectează ioctl-urile în grupuri pentru un scop comun sau un controlor comun) și un număr de serie pe 8 biți.

Macrocomenzile care descriu această structură se află în <asm/ioctl.h> și sunt _IO(tip,nr) și {_IOR,_IOW,_IOWR}(tip,nr,dimensiune). Acestea utilizează sizeof(size), astfel încât „size” (dimensiunea) este un termen greșit aici: acest al treilea argument este un tip de date.

Rețineți că biții de dimensiune sunt foarte nesiguri: în multe cazuri sunt greșiți, fie din cauza unor macroprograme cu erori care utilizează sizeof(sizeof(struct)), fie din cauza valorilor vechi.

Astfel, se pare că noua structură a oferit doar dezavantaje: nu ajută la verificare, dar determină valori diferite pentru diferitele arhitecturi.

CONSULTAȚI ȘI
execve(2), fcntl(2), ioctl_console(2), ioctl_fat(2), ioctl_fs(2), ioctl_fsmap(2), ioctl_nsfs(2), ioctl_tty(2), ioctl_userfaultfd(2), ioctl_eventpoll(2), open(2), sd(4), tty(4)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.