ioctl(2) System Calls Manual ioctl(2) NUME ioctl - controleaza dispozitivul BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include int ioctl(int fd, unsigned long request, ...); /* glibc, BSD */ int ioctl(int fd, int request, ...); /* musl, alte UNIX */ DESCRIERE Apelul de sistem ioctl() manipuleaza parametrii de dispozitiv subiacente ai fiierelor speciale. In special, multe dintre caracteristicile de funcionare ale fiierelor speciale de caractere (de exemplu, terminale) pot fi controlate cu ajutorul cererilor ioctl(). Argumentul fd trebuie sa fie un descriptor de fiier deschis. Al doilea argument este un cod de solicitare care depinde de dispozitiv. Cel de-al treilea argument este un indicator de memorie fara tip. In mod tradiional, este char *argp (din zilele de dinainte ca void * sa fie valabil in C) i va fi numit astfel pentru aceasta discuie. O cerere ioctl() are codificata in ea insai daca argumentul este un parametru de intrare sau un parametru de ieire, precum i dimensiunea argumentului argp in octei. Macrocomenzile i definiiile utilizate in specificarea unei cerer ioctl() sunt localizate in fiierul . A se vedea NOTE. VALOAREA RETURNATA De obicei, in caz de succes, se returneaza zero. Cateva cereri ioctl() utilizeaza valoarea de returnare ca parametru de ieire i returneaza o valoare nenegativa in caz de succes. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EBADF descriptor-fiier nu este un descriptor de fiier valid. EFAULT argp face referire la o zona de memorie inaccesibila. EINVAL request (cererea) sau argp nu sunt valide. ENOTTY fd nu este asociat cu un dispozitiv special de caractere. ENOTTY Cererea specificata nu se aplica tipului de obiect la care face referire descriptorul de fiier fd. VERSIUNI Argumentele, returnarile i semantica lui ioctl() variaza in funcie de controlorul de dispozitiv in cauza (apelul este utilizat ca o soluie de tip ,,catch-all" (captureaza-tot) pentru operaiile care nu se incadreaza in mod clar in modelul fluxului de In/Ie UNIX). STANDARDE Niciunul. ISTORIC AT&T UNIX versiunea 7 are ioctl(int fildes, int request, struct sgttyb *argp); (unde struct sgttyb a fost folosita istoric de stty(2) i gtty(2) i este polimorfa in funcie de tipul de cerere (aa cum ar fi fost un void *, daca ar fi fost disponibil)). SysIII documenteaza arg fara niciun tip. 4.3BSD are ioctl(int d, unsigned long cerere, char *argp); (cu char * in mod similar cu void *). SysVr4 are int ioctl(int fildes, int cerere, ... /* arg */); NOTE Pentru a utiliza acest apel, este nevoie de un descriptor de fiier deschis. Adesea, apelul open(2) are efecte secundare nedorite, care pot fi evitate in Linux prin aplicarea fanionului O_NONBLOCK. structura ioctl Valorile comenzii ioctl sunt constante pe 32 de bii. In principiu, aceste constante sunt complet arbitrare, dar oamenii au incercat sa le construiasca o anumita structura. Vechea situaie din Linux era cea a constantelor pe 16 bii, in care ultimul octet este un numar serial, iar octetul (octeii) precedent(i) ofera un tip care indica controlorul. Uneori se folosea numarul 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" indicand controlorul terminalului, iar CYGETTIMEOUT are valoarea 0x00435906, cu 0x43 0x59 = ,,C" ,,Y" indicand controlorul de ,,cyclades". Mai tarziu (0.98p5), in numar au fost introduse mai multe informaii. Unul are 2 bii de direcie (00: niciunul, 01: scriere, 10: citire, 11: citire/scriere), urmat de 14 bii de dimensiune (care dau dimensiunea argumentului), urmat de un tip pe 8 bii (care colecteaza ioctl-urile in grupuri pentru un scop comun sau un controlor comun) i un numar de serie pe 8 bii. Macrocomenzile care descriu aceasta structura se afla in i sunt _IO(tip,nr) i {_IOR,_IOW,_IOWR}(tip,nr,dimensiune). Acestea utilizeaza sizeof(size), astfel incat ,,size" (dimensiunea) este un termen greit aici: acest al treilea argument este un tip de date. Reinei ca biii de dimensiune sunt foarte nesiguri: in multe cazuri sunt greii, fie din cauza unor macroprograme cu erori care utilizeaza sizeof(sizeof(struct)), fie din cauza valorilor vechi. Astfel, se pare ca noua structura a oferit doar dezavantaje: nu ajuta la verificare, dar determina valori diferite pentru diferitele arhitecturi. CONSULTAI 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 in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 ioctl(2)