table of contents
- bookworm-backports 1:4.24.0-2~bpo12+1
- testing 1:4.24.0-2
- unstable 1:4.24.0-2
ioctl(2) | System Calls Manual | ioctl(2) |
NAZWA¶
ioctl - steruje urządzeniem
BIBLIOTEKA¶
Standardowa biblioteka C (libc, -lc)
SKŁADNIA¶
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
OPIS¶
Wywołanie systemowe ioctl manipuluje na podległych jej parametrach urządzeń, do których dostęp odbywa się poprzez pliki specjalne. W szczególności, za pomocą żądań ioctl() można kontrolować wiele właściwości operacyjnych specjalnych plików znakowych (np. terminali). Argument fd musi być otwartym deskryptorem pliku.
Drugi argument jest zależnym od urządzenia kodem polecenia. Trzeci argument jest pozbawionym typu wskaźnikiem do obszaru pamięci, tradycyjnie char *argp (pochodzi z okresu zanim void * stało się poprawne w C) i tak będzie nazywany w niniejszej dyskusji.
Ioctl() request zawiera w sobie zakodowaną informację czy argument jest parametrem wejściowym czy wyjściowym oraz rozmiar argp tego argumentu w bajtach. Makra i definicje, używane do przekazywania request do ioctl(), znajdują się w pliku <sys/ioctl.h>. Zobacz UWAGI
WARTOŚĆ ZWRACANA¶
Zazwyczaj, po pomyślnym zakończeniu zwracane jest zero. Niektóre żądania ioctl() używają zwracanej wartości jako parametru wyjściowego i zwracają wówczas pewną wartość nieujemną. Po błędzie zwracane jest -1 i ustawiane errno wskazując błąd.
BŁĘDY¶
STANDARDY¶
Brak jednego standardu. Argumenty, zwracane wartości i semantyka ioctl() różnią się w zależności od sterownika urządzenia, którego dotyczą (wywołanie jest używane jako uniwersalne dla operacji, które nie dają się ładnie dopasować do uniksowego modelu strumieni we/wy).
Funkcja ioctl() pojawiła się w wersji 7 AT&T UNIX.
UWAGI¶
Aby używać niniejszego wywołanie, konieczny jest otwarty deskryptor pliku. Często wywołanie open(2) daje niepożądane skutki uboczne, którym pod Linuksem można zapobiec podając znacznik O_NONBLOCK.
Struktura ioctl¶
Wartości poleceń ioctl są 32-bitowymi stałymi. Generalnie stałe te są zupełnie przypadkowe, jednak niektórzy próbują je jakoś strukturyzować.
Wcześniej, w Linuksie większość 16-bitowych stałych składała się z ostatniego bajtu będącego numerem seryjnym i poprzedzającego go bajtu (bajtów) typu, który wskazuje sterownik. Czasem używany był numer główny: 0x03 do ioctl HDIO_*, 0x06 do ioctl LP*. Czasem używana była również litera (lub kilka) ASCII. Przykładowo TCGETS ma wartość 0x00005401, z 0x54 = „T” wskazującym sterownik terminala, a CYGETTIMEOUT ma wartość 0x00435906, gdzie 0x43 0x59 = „C” „Y” wskazuje sterownik cyclades.
Później (0.98p5) wbudowano w numer nieco więcej informacji. Miał on 2 bity kierunku (00: brak, 01: zapis, 10: odczyt, 11: odczyt/zapis), po których następowało 14 bitów rozmiaru (wskazujących rozmiar argumentu), po których następował 8-bitowy typ (zbierający ioctl-e w grupy wg wspólnego zastosowania lub wspólnego sterownika) i 8-bitowy numer seryjny.
Makra opisujące tę strukturę istnieją w <asm/ioctl.h> i są to _IO(type,nr) oraz {_IOR,_IOW,_IOWR}(type,nr,size). Używają sizeof(size), tak więc rozmiar (size) jest tu błędną nazwą: trzeci argument jest typem danych.
Proszę zauważyć, że bity rozmiaru są bardzo niepewne: w wielu przypadkach są nieprawidłowe, albo ze względu na błędne makra używające sizeof(sizeof(struct)), albo ze względu na przestarzałe wartości.
Wszystko wskazuje zatem na to, że nowa struktura ma same wady: nie pomaga w sprawdzaniu, a powoduje zróżnicowanie wartości na różnych architekturach.
ZOBACZ TAKŻE¶
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)
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
5 lutego 2023 r. | Linux man-pages 6.03 |