ioctl(2) System Calls Manual ioctl(2)

ioctl - controlează dispozitivul

Biblioteca C standard (libc, -lc)

#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);  /* glibc, BSD */
int ioctl(int fd, int request, ...);            /* musl, alte UNIX */

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 cererilor ioctl(). Argumentul fd trebuie să fie un descriptor de fișier deschis.

Al doilea argument este un cod de solicitare 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 cerere 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.

De obicei, în caz de succes, se returnează zero. Câteva cereri 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.

descriptor-fișier nu este un descriptor de fișier valid.
argp face referire la o zonă de memorie inaccesibilă.
request (cererea) sau argp nu sunt valide.
fd nu este asociat cu un dispozitiv special de caractere.
Cererea specificată nu se aplică tipului de obiect la care face referire descriptorul de fișier fd.

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).

Niciunul.

AT&T UNIX versiunea 7 are

ioctl(int fildes, int request, 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 cerere (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 cerere, char *argp);

(cu char * în mod similar cu void *).

SysVr4 are

int ioctl(int fildes, int cerere, ... /* arg */);

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.

Valorile comenzii 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.

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)

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 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.

31 octombrie 2023 Pagini de manual de Linux 6.06