ioctl(2) System Calls Manual ioctl(2) NAZWA ioctl - steruje urzadzeniem BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int ioctl(int fd, unsigned long op, ...); /* glibc, BSD */ int ioctl(int fd, int op, ...); /* musl, inny UNIX */ OPIS Wywolanie systemowe ioctl manipuluje na podleglych jej parametrach urzadzen, do ktorych dostep odbywa sie poprzez pliki specjalne. W szczegolnosci, za pomoca operacji ioctl() mozna kontrolowac wiele wlasciwosci operacyjnych specjalnych plikow znakowych (np. terminali). Argument fd musi byc otwartym deskryptorem pliku. Drugi argument jest zaleznym od urzadzenia kodem operacji. Trzeci argument jest pozbawionym typu wskaznikiem do obszaru pamieci, tradycyjnie char *argp (pochodzi z okresu zanim void * stalo sie poprawne w C) i tak bedzie nazywany w niniejszej dyskusji. op Ioctl() zawiera w sobie zakodowana informacje czy argument jest parametrem wejsciowym czy wyjsciowym oraz rozmiar argp tego argumentu w bajtach. Makra i definicje, uzywane do przekazywania op do ioctl(), znajduja sie w pliku . Zobacz UWAGI WARTOSC ZWRACANA Zazwyczaj, po pomyslnym zakonczeniu zwracane jest zero. Niektore operacje ioctl() uzywaja zwracanej wartosci jako parametru wyjsciowego i zwracaja wowczas pewna wartosc nieujemna. Po bledzie zwracane jest -1 i ustawiane errno wskazujac blad. BLEDY EBADF fd nie jest prawidlowym deskryptorem pliku. EFAULT argp wskazuje na niedostepny obszar pamieci. EINVAL op lub argp sa nieprawidlowe. ENOTTY fd nie jest zwiazane z urzadzeniem znakowym. ENOTTY Podana operacja nie ma zastosowania do obiektu, na ktory wskazuje deskryptor fd. WERSJE Argumenty, zwracane wartosci i semantyka ioctl() roznia sie w zaleznosci od sterownika urzadzenia, ktorego dotycza (wywolanie jest uzywane jako uniwersalne dla operacji, ktore nie daja sie ladnie dopasowac do uniksowego modelu strumieni wejscia/wyjscia). STANDARDY Brak. HISTORIA Wersja 7 AT&T UNIX posiadala ioctl(int fildes, int op, struct sgttyb *argp); (gdzie struct sgttyb historycznie uzywane bylo przez stty(2) i gtty(2) i jest polimorficzne, zaleznie od typu operacji (podobnie, jak byloby void *, gdyby bylo dostepne)). SysIII dokumentuje arg bez zadnego typu. 4.3BSD mialo ioctl(int d, unsigned long op, char *argp); (z char * podobnie jak w przypadku void *). SysVr4 mialo int ioctl(int fildes, int op, ... /* arg */); UWAGI Aby uzywac niniejszego wywolanie, konieczny jest otwarty deskryptor pliku. Czesto wywolanie open(2) daje niepozadane skutki uboczne, ktorym pod Linuksem mozna zapobiec podajac znacznik O_NONBLOCK. Struktura ioctl Wartosci op ioctl sa 32-bitowymi stalymi. Generalnie stale te sa zupelnie przypadkowe, jednak niektorzy probuja je jakos strukturyzowac. Wczesniej, w Linuksie wiekszosc 16-bitowych stalych skladala sie z ostatniego bajtu bedacego numerem seryjnym i poprzedzajacego go bajtu (bajtow) typu, ktory wskazuje sterownik. Czasem uzywany byl numer glowny: 0x03 do ioctl HDIO_*, 0x06 do ioctl LP*. Czasem uzywana byla rowniez litera (lub kilka) ASCII. Przykladowo TCGETS ma wartosc 0x00005401, z 0x54 = ,,T" wskazujacym sterownik terminala, a CYGETTIMEOUT ma wartosc 0x00435906, gdzie 0x43 0x59 = ,,C" ,,Y" wskazuje sterownik cyclades. Pozniej (0.98p5) wbudowano w numer nieco wiecej informacji. Mial on 2 bity kierunku (00: brak, 01: zapis, 10: odczyt, 11: odczyt/zapis), po ktorych nastepowalo 14 bitow rozmiaru (wskazujacych rozmiar argumentu), po ktorych nastepowal 8-bitowy typ (zbierajacy ioctl-e w grupy wg wspolnego zastosowania lub wspolnego sterownika) i 8-bitowy numer seryjny. Makra opisujace te strukture istnieja w i sa to _IO(type,nr) oraz {_IOR,_IOW,_IOWR}(type,nr,size). Uzywaja sizeof(size), tak wiec rozmiar (size) jest tu bledna nazwa: trzeci argument jest typem danych. Prosze zauwazyc, ze bity rozmiaru sa bardzo niepewne: w wielu przypadkach sa nieprawidlowe, albo ze wzgledu na bledne makra uzywajace sizeof(sizeof(struct)), albo ze wzgledu na przestarzale wartosci. Wszystko wskazuje zatem na to, ze nowa struktura ma same wady: nie pomaga w sprawdzaniu, a powoduje zroznicowanie wartosci na roznych architekturach. ZOBACZ TAKZE 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) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 13 czerwca 2024 r. ioctl(2)