返回值

成功时,将返回0。错误时,返回-1,并设置errno。

IOCTL_CONSOLE - Linux手册页

Linux程序员手册 第2部分
更新日期: 2017-09-15

备注

警告:请勿将此手册页视为Linux控制台ioctl的文档。仅出于好奇提供此功能,作为阅读源代码的替代方法。 Ioctl是未记录的Linux内部组件,可能会在无警告的情况下进行更改。 (的确,此页面或多或少地描述了内核版本1.1.94的情况;与早期版本有许多小的和不太小的差异。)

通常,会引入ioctl来在内核和一个特定的知名程序(fdisk,hdparm,setserial,tunelp,loadkeys,selection,setfont等)之间进行通信,并且在此特定程序要求时,它们的行为也会更改。

使用这些ioctl的程序不能移植到其他版本的UNIX,不能在较旧的Linux上运行,也不能在将来的Linux版本上运行。

使用POSIX函数。

说明

控制台终端和虚拟控制台支持以下特定于Linux的ioctl(2)请求。每个参数都需要第三个参数,此处假定为argp。

KDGETLED

获取LED的状态。 argp指向一个字符。 * argp的低三位被设置为LED的状态,如下所示:

LED_CAP0x04caps lock led
LED_NUM0x02num lock led
LED_SCR0x01scroll lock led
KDSETLED

设置指示灯。 LED设置为与argp中无符号长整数的低三位相对应。但是,如果设置了更高的位,则LED会恢复正常:显示大写锁定,数字锁定和滚动锁定的键盘功能状态。

在Linux 1.1.54之前,LED只是反映了相应键盘标志的状态,而KDGETLED / KDSETLED也会更改键盘标志。从Linux 1.1.54开始,LED可以显示任意信息,但是默认情况下,它们显示键盘标志。以下两个ioctl用于访问键盘标志。

KDGKBLED

获取键盘标志CapsLock,NumLock,ScrollLock(不亮)。 argp指向设置为标志状态的char。低三位(掩码0x7)获得当前标志状态,下一个半字节(掩码0x70)的低位获得默认标志状态。 (从Linux 1.1.54开始。)

KDSKBLED

设置键盘标志CapsLock,NumLock,ScrollLock(不亮)。 argp是具有所需标志状态的无符号长整数。低三位(掩码0x7)具有标志状态,下一个半字节(掩码0x70)的低位具有默认标志状态。 (从Linux 1.1.54开始。)

KDGKBTYPE

获取键盘类型。这将返回值KB_101,定义为0x02。

KDADDIO

将I / O端口添加为有效端口。等效于ioperm(arg,1,1)。

KDDELIO

删除I / O端口为有效端口。等效于ioperm(arg,1,0)。

KDENABIO

启用对视频板的I / O。等效于ioperm(0x3b4,0x3df-0x3b4 + 1,1)。

KDDISABIO

禁用视频板的I / O。等效于ioperm(0x3b4,0x3df-0x3b4 + 1,0)。

KDSETMODE

设置文本/图形模式。 argp是一个无符号整数,包含以下之一:

KD_TEXT0x00
KD_GRAPHICS0x01
KDGETMODE

获取文本/图形模式。 argp指向一个int,该int设置为KDSETMODE上面显示的值之一。

KDMKTONE

产生指定长度的音调。 argp中无符号长整数的低16位指定以时钟周期为单位的周期,高16位给出以毫秒为单位的持续时间。如果持续时间为零,则声音将关闭。控制权立即返回。例如,argp =(125

KIOCSOUND

开始或停止声音生成。 argp的低16位指定时钟周期的周期(即argp = 1193180 / frequency)。 argp = 0关闭声音。无论哪种情况,控制权都会立即返回。

GIO_CMAP

从内核获取当前的默认颜色图。 argp指向48字节数组。 (从Linux 1.3.3开始)

PIO_CMAP

更改默认的文本模式颜色图。 argp指向一个48字节的数组,该数组按顺序包含16种可用屏幕颜色的Red,Green和Blue值:0为关闭,255为全亮度。默认颜色依次为:黑色,深红色,深绿色,棕色,深蓝色,深紫色,深青色,浅灰色,深灰色,鲜红色,鲜绿色,黄色,鲜蓝色,鲜紫色,鲜青和白色。 (从Linux 1.3.3开始)

GIO_FONT

以扩展形式获取256个字符的屏幕字体。 argp指向8192字节的数组。如果当前加载的字体是512个字符的字体,或者控制台未处于文本模式,则失败,并显示错误代码EINVAL。

GIO_FONTX

获取屏幕字体和相关信息。 argp指向结构consolefontdesc(请参阅PIO_FONTX)。在调用时,应将charcount字段设置为chardata指向的缓冲区中可容纳的最大字符数。返回时,charcount和charheight填充有当前加载字体的相应数据,并且如果charcount的初始值指示有足够的​​空间,则chardata数组将包含字体数据。否则,缓冲区保持不变,并且将errno设置为ENOMEM。 (从Linux 1.3.1开始)

PIO_FONT

设置256个字符的屏幕字体。将字体加载到EGA / VGA字符生成器中。 argp指向8192字节的映射,每个字符32字节。仅其中的前N个用于8x N字体(0 <N

PIO_FONTX

设置屏幕字体和关联的渲染信息。 argp指向一个

struct consolefontdesc {
    unsigned short charcount;  /* characters in font
                                  (256 or 512) */
    unsigned short charheight; /* scan lines per
                                  character (1-32) */
    char          *chardata;   /* font data in
                                  expanded form */
};

如有必要,将适当调整屏幕大小,并将SIGWINCH发送到适当的进程。此调用还会使Unicode映射无效。 (从Linux 1.3.1开始)

PIO_FONTRESET

将屏幕字体,大小和Unicode映射重置为启动默认值。 argp尚未使用,但应设置为NULL以确保与Linux的未来版本兼容。 (从Linux 1.3.28开始。)

GIO_SCRNMAP

从内核获取屏幕映射。 argp指向E_TABSZ大小的区域,该区域装有用于显示每个字符的字体位置。如果当前加载的字体超过256个字符,则此调用可能返回无用的信息。

GIO_UNISCRNMAP

从内核获取完整的Unicode屏幕映射。 argp指向大小为E_TABSZ * sizeof(unsigned short)的区域,该区域装有每个字符代表的Unicode。从U + F000开始的一组特殊的Unicode用于表示"直接到字体"的映射。 (从Linux 1.3.1开始)

PIO_SCRNMAP

加载内核中的"用户可定义"(第四)表,该表将字节映射到控制台屏幕符号。 argp指向大小为E_TABSZ的区域。

PIO_UNISCRNMAP

加载内核中的"用户可定义"(第四)表,该表将字节映射为Unicode,然后根据当前加载的Unicode字体映射将其转换为屏幕符号。从U + F000开始的特殊Unicode可用于直接映射到字体符号。 (从Linux 1.3.1开始)

GIO_UNIMAP

从内核获取Unicode到字体的映射。 argp指向一个

struct unimapdesc {
    unsigned short  entry_ct;
    struct unipair *entries;
};

条目指向的数组

struct unipair {
    unsigned short unicode;
    unsigned short fontpos;
};

(从Linux 1.1.92开始。)

PIO_UNIMAP

将unicode到字体的映射放入内核。 argp指向结构unimapdesc。 (从Linux 1.1.92开始)

PIO_UNIMAPCLR

清除表,可能建议使用哈希算法。 argp指向一个

struct unimapinit {
    unsigned short advised_hashsize;  /* 0 if no opinion */
    unsigned short advised_hashstep;  /* 0 if no opinion */
    unsigned short advised_hashlevel; /* 0 if no opinion */
};

(从Linux 1.1.92开始。)

KDGKBMODE

获取当前的键盘模式。 argp指向一个long整型的值,值设置为以下之一:

K_RAW0x00 /* Raw (scancode) mode */
K_XLATE0x01 /* Translate keycodes using keymap */
K_MEDIUMRAW0x02 /* Medium raw (scancode) mode */
K_UNICODE0x03 /* Unicode mode */
K_OFF0x04 /* Disabled mode; since Linux 2.6.39 */
KDSKBMODE

设置当前的键盘模式。 argp的长度等于KDGKBMODE所示的值之一。

KDGKBMETA

获取元密钥处理模式。 argp指向一个设置为以下值之一的long型:

K_METABIT0x03set high order bit
K_ESCPREFIX0x04escape prefix
KDSKBMETA

设置元密钥处理模式。 argp的长度等于KDGKBMETA上面显示的值之一。

KDGKBENT

在键转换表中获取一个条目(键代码到操作代码)。 argp指向一个

struct kbentry {
    unsigned char  kb_table;
    unsigned char  kb_index;
    unsigned short kb_value;
};

前两个成员均已填写:kb_table选择密钥表(0

KDSKBENT

在转换表中设置一个条目。 argp指向结构kbentry。

KDGKBSENT

获取一个功能键字符串。 argp指向一个

struct kbsentry {
    unsigned char kb_func;
    unsigned char kb_string[512];
};

kb_string设置为与第kb_func个功能键操作代码相对应的(空终止)字符串。

KDSKBSENT

设置一个功能键字符串条目。 argp指向kbsentry结构。

KDGKBDIACR

阅读内核口音表。 argp指向一个

struct kbdiacrs {
    unsigned int   kb_cnt;
    struct kbdiacr kbdiacr[256];
};

其中kb_cnt是数组中的条目数,每个条目都是一个

struct kbdiacr {
    unsigned char diacr;
    unsigned char base;
    unsigned char result;
};
KDGETKEYCODE

读取内核键码表条目(将代码扫描到键码)。 argp指向一个

struct kbkeycode {
    unsigned int scancode;
    unsigned int keycode;
};

键码设置为与给定的扫描码相对应。 (89

KDSETKEYCODE

编写内核键码表条目。 argp指向结构kbkeycode。 (从Linux 1.1.63开始。)

KDSIGACCEPT

当通过按下适当的组合键生成信号argp时,调用过程表明它愿意接受信号argp。 (1

VT_OPENQRY

返回第一个可用(未打开)的控制台。 argp指向一个整数,该整数设置为vt的数字(1

VT_GETMODE

获取活动vt的模式。 argp指向一个

struct vt_mode {
    char  mode;    /* vt mode */
    char  waitv;   /* if set, hang on writes if not active */
    short relsig;  /* signal to raise on release req */
    short acqsig;  /* signal to raise on acquisition */
    short frsig;   /* unused (set to 0) */
};

设置为活动vt的模式。模式设置为以下值之一:

VT_AUTOauto vt switching
VT_PROCESSprocess controls switching
VT_ACKACQacknowledge switch
VT_SETMODE

设置活动vt的模式。 argp指向结构vt_mode。

VT_GETSTATE

获取全局vt状态信息。 argp指向一个

struct vt_stat {
    unsigned short v_active;  /* active vt */
    unsigned short v_signal;  /* signal to send */
    unsigned short v_state;   /* vt bit mask */
};

对于使用中的每个vt,将设置v_state成员中的相应位。 (内核1.0到1.1.92。)

VT_RELDISP

释放显示器。

VT_ACTIVATE

切换到vt argp(1

VT_WAITACTIVE

等待直到vt argp被激活。

VT_DISALLOCATE

取消分配与vt argp关联的内存。 (从Linux 1.1.54开始。)

VT_RESIZE

设置内核的screensize概念。 argp指向一个

struct vt_sizes {
    unsigned short v_rows;       /* # rows */
    unsigned short v_cols;       /* # columns */
    unsigned short v_scrollsize; /* no longer used */
};

请注意,这不会更改视频模式。参见resizecons(8)。 (从Linux 1.1.54开始。)

VT_RESIZEX

设置内核对各种屏幕参数的想法。 argp指向一个

struct vt_consize {
    unsigned short v_rows;  /* number of rows */
    unsigned short v_cols;  /* number of columns */
    unsigned short v_vlin;  /* number of pixel rows
                               on screen */
    unsigned short v_clin;  /* number of pixel rows
                               per character */
    unsigned short v_vcol;  /* number of pixel columns
                               on screen */
    unsigned short v_ccol;  /* number of pixel columns
                               per character */
};

可以将任何参数设置为零,表示"无更改",但是如果设置了多个参数,则它们必须是自洽的。请注意,这不会更改视频模式。参见resizecons(8)。 (从Linux 1.3.3开始)

以下ioctl的操作取决于argp所指向的结构中的第一个字节,这里称为子代码。这些仅对超级用户或当前终端的所有者合法。

TIOCLINUX, subcode=0

转储屏幕。在Linux 1.1.92中消失。 (对于内核1.1.92或更高版本,请改为从/ dev / vcsN或/ dev / vcsaN中读取。)

TIOCLINUX, subcode=1

获取任务信息。在Linux 1.1.92中消失。

TIOCLINUX, subcode=2

设置选择。 argp指向一个

struct {
    char  subcode;
    short xs, ys, xe, ye;
    short sel_mode;
};

xs和ys是起始列和行。 xe和ye是结尾的列和行。 (左上角为row = column = 1。)sel_mode为0(逐个字符选择),1(逐个单词选择)或2(逐行选择)。所指示的屏幕字符将突出显示并保存在devices / char / console.c中的静态数组sel_buffer中。

TIOCLINUX, subcode=3

粘贴选择。选择缓冲区中的字符被写入fd。

TIOCLINUX, subcode=4

打开屏幕空白。

TIOCLINUX, subcode=5

设置一个256位查找表的内容,该表定义"单词"中的字符,以逐字选择。 (从Linux 1.1.32开始。)

TIOCLINUX, subcode=6

argp指向一个char,该char被设置为内核变量shift_state的值。 (从Linux 1.1.32开始。)

TIOCLINUX, subcode=7

argp指向一个char,该char设置为内核变量report_mouse的值。 (从Linux 1.1.33开始。)

TIOCLINUX, subcode=8

转储屏幕的宽度和高度,光标位置以及所有字符-属性对。 (仅内核1.1.67到1.1.91。对于内核1.1.92或更高版本,请改读/ dev / vcsa *。)

TIOCLINUX, subcode=9

恢复屏幕的宽度和高度,光标位置以及所有字符-属性对。 (仅内核1.1.67至1.1.91。对于内核1.1.92或更高版本,请改写到/ dev / vcsa *。)

TIOCLINUX, subcode=10
Handles the Power Saving feature of the new generation of monitors. VESA screen blanking mode is set to argp[1],

which governs what
screen blanking does:

0:

屏幕空白被禁用。

1:

保存当前的视频适配器寄存器设置,然后将控制器编程为关闭垂直同步脉冲。这会将显示器置于"待机"模式。如果您的监视器具有Off_Mode计时器,则它将最终自行关闭电源。

2:

保存当前设置,然后关闭垂直和水平同步脉冲。这会将显示器置于"关闭"模式。如果您的显示器没有Off_Mode计时器,或者您希望显示器在blank_timer超时后立即关闭电源,则可以选择此选项。 (警告:频繁关闭电源会损坏显示器。)(从Linux 1.1.76开始。)

名称

ioctl_console-用于控制台终端和虚拟控制台的ioctl

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

另外参见

dumpkeys(1),kbd_mode(1),loadkeys(1),mknod(1),setleds(1),setmetamode(1),execve(2),fcntl(2),ioctl_tty(2),ioperm(2), termios(3),console_codes(4),mt(4),sd(4),tty(4),ttyS(4),vcs(4),vcsa(4),charsets(7),mapscrn(8), resizecons(8),setfont(8)

/usr/include/linux/kd.h、/usr/include/linux/vt.h

错误说明

errno可以采用以下值:

EBADF

文件描述符无效。

EINVAL

文件描述符或argp无效。

ENOTTY

文件描述符未与字符特殊设备关联,或者指定的请求不适用于该设备。

EPERM

权限不足。

日期:2019-08-20 18:01:45 来源:oir作者:oir