ioctl
用於向設備發控制和配置命令,有些命令也需要讀寫一些數據,但這些數據是不能用read
/write
讀寫的,稱為Out-of-band數據。也就是說,read
/write
讀寫的數據是in-band數據,是I/O操作的主體,而ioctl
命令傳送的是控制信息,其中的數據是輔助的數據。例如,在串口線上收發數據通過read
/write
操作,而串口的波特率、校驗位、停止位通過ioctl
設置,A/D轉換的結果通過read
讀取,而A/D轉換的精度和工作頻率通過ioctl
設置。
#include <sys/ioctl.h> int ioctl(int d, int request, ...);
d
是某個設備的檔案描述符。request
是ioctl
的命令,可變參數取決於request
,通常是一個指向變數或結構體的指針。若出錯則返回-1,若成功則返回其他值,返回值也是取決於request
。
以下程序使用TIOCGWINSZ
命令獲得終端設備的窗口大小。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> int main(void) { struct winsize size; if (isatty(STDOUT_FILENO) == 0) exit(1); if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &size)<0) { perror("ioctl TIOCGWINSZ error"); exit(1); } printf("%d rows, %d columns\n", size.ws_row, size.ws_col); return 0; }
在圖形界面的終端裡多次改變終端窗口的大小並運行該程序,觀察結果。