Scroll to navigation

ioctl(2) System Calls Manual 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

descriptor-fișier nu este un descriptor de fișier valid.
argp face referire la o zonă de memorie inaccesibilă.
op (operația) sau argp nu sunt valide.
fd nu este asociat cu un dispozitiv special de caractere.
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_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)

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

2 mai 2024 Pagini de manual de Linux 6.8