IOCTL_TTY - Linux手册页

时间:2019-08-20 17:58:54  来源:igfitidea点击:

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

名称

ioctl_tty-终端和串行线的ioctl

语法

#包括

int ioctl(int fd,int cmd,...);

说明

终端和串行端口的ioctl(2)调用接受许多可能的命令参数。多数要求使用不同类型的第三个参数,此处称为argp或arg。

使用ioctl可以用于非便携式程序。尽可能使用termios(3)中描述的POSIX接口。

Get and set terminal attributes

TCGETS struct termios *argp
相当于 tcgetattr(fd,argp)。
获取当前的串口设置。
TCSETS const struct termios *argp
相当于 tcsetattr(fd,TCSANOW,argp)。
设置当前的串行端口设置。
TCSETSW const struct termios *argp
相当于 tcsetattr(fd,TCSADRAIN,argp)。
允许输出缓冲区耗尽,并设置当前的串行端口设置。
TCSETSF const struct termios *argp
相当于 tcsetattr(fd,TCSAFLUSH,argp)。
允许输出缓冲区耗尽,丢弃待处理的输入并设置当前的串行端口设置。

以下四个ioctl就像TCGETSTCSETSTCSETSW,TCSETSF一样,只不过它们采用结构术语而不是结构术语

TCGETA结构术语* argp
TCSETA const struct termio * argp
TCSETAW const struct termio * argp
TCSETAF const struct termio * argp

Locking the termios structure


终端的termios结构可以被锁定。锁本身是一个termios结构,其中的非零位或字段指示锁定的值。

TIOCGLCKTRMIOS struct termios *argp
获取的锁定状态 终端的termios结构。
TIOCSLCKTRMIOS const struct termios *argp
设置锁定状态 终端的termios结构。只有具有CAP_SYS_ADMIN功能的进程才能执行此操作。

Get and set window size

窗口大小保留在内核中,但内核不使用(虚拟控制台除外,在虚拟控制台的情况下,当虚拟控制台的大小发生变化(例如,通过加载新字体)时,内核将更新窗口大小)。

在中定义了以下常量和结构。

TIOCGWINSZ struct winsize *argp
获取窗口大小。
TIOCSWINSZ const struct winsize *argp
设置窗口大小。

这些ioctl使用的结构定义为

struct winsize {
    unsigned short ws_row;
    unsigned short ws_col;
    unsigned short ws_xpixel;   /* unused */
    unsigned short ws_ypixel;   /* unused */
};

当窗口大小更改时,SIGWINCH信号将发送到前台进程组。

Sending a break

TCSBRK int arg
相当于 tcsendbreak(fd,arg)。
如果终端使用异步串行数据传输,并且arg为零,则发送中断(零位流),持续0.25至0.5秒。如果终端未使用异步串行数据传输,则发送中断,或者函数不执行任何操作而返回。当arg为非零时,没人知道会发生什么。
(SVr4,UnixWare,Solaris,Linux将tcsendbreak(fd,arg)与tcdrain(fd)等非零arg一起对待。SunOS将arg视为乘法器,并发送与arg为零一样长的arg时间流。DG / UX和AIX将arg(非零时)视为以毫秒为单位的时间间隔。HP-UX忽略arg。)
TCSBRKP int arg
所谓的" POSIX版本" TCSBRK。它将非零arg视为一个以秒为单位的时间间隔,并且在驱动程序不支持中断时不执行任何操作。
TIOCSBRK void
打开中断,即开始发送零位。
TIOCCBRK void
关闭中断,即停止发送零位。

Software flow control

TCXONC int arg
相当于 tcflow(fd,arg)。
有关参数值TCOOFFTCOONTCIOFFTCION,请参见tcflow(3)。

Buffer count and flushing

FIONREAD int *argp
获取输入缓冲区中的字节数。
TIOCINQ int *argp
和...一样 FIONREAD。
TIOCOUTQ int *argp
获取输出缓冲区中的字节数。
TCFLSH int arg
相当于 tcflush(fd,arg)。
有关参数值TCIFLUSHTCOFLUSHTCIOFLUSH,请参见tcflush(3)。

Faking input

TIOCSTI const char *argp
将给定的字节插入输入队列。

Redirecting console output

TIOCCONS void
重定向原本可以输出到 / dev / console或/ dev / tty0到给定的终端。如果那是伪终端主机,则将其发送给从机。在2.6.10之前的Linux中,只要输出尚未重定向,任何人都可以执行此操作。从2.6.10版本开始,只有具有CAP_SYS_ADMIN功能的进程才能执行此操作。如果输出已经被重定向,则返回EBUSY,但是可以通过使用此ioctl并使用fd指向/ dev / console或/ dev / tty0来停止重定向。

Controlling terminal

TIOCSCTTY int arg
使给定终端成为呼叫过程的控制终端。 呼叫过程必须是会话领导者,并且还没有控制终端。在这种情况下,应将arg指定为零。
如果此终端已经是另一个会话组的控制终端,则除非调用方具有CAP_SYS_ADMIN能力且arg等于1,否则ioctl会失败并显示EPERM,在这种情况下,该终端将被盗,并将拥有该终端的所有进程作为控制终端失去它。
TIOCNOTTY void
如果给定终端是呼叫过程的控制终端, 放弃该控制终端。如果该进程是会话领导者,则将SIGHUP和SIGCONT发送到前台进程组,并且当前会话中的所有进程都将失去其控制终端。

Process group and session ID

TIOCGPGRP pid_t *argp
成功时,相当于 * argp = tcgetpgrp(fd)。
获取该终端上前台进程组的进程组ID。
TIOCSPGRP const pid_t *argp
相当于 tcsetpgrp(fd,* argp)。
设置该终端的前台进程组ID。
TIOCGSID pid_t *argp
获取给定终端的会话ID。 如果该终端不是主伪终端,而不是我们的控制终端,则失败并显示错误ENOTTY。奇怪。

Exclusive mode

TIOCEXCL void
将终端置于独占模式。 不允许在终端上进行进一步的open(2)操作。 (除了具有CAP_SYS_ADMIN功能的进程外,它们因EBUSY失败。)
TIOCGEXCL int *argp
(从Linux 3.8开始) 如果终端当前处于独占模式,则在argp指向的位置放置一个非零值;否则,将零放在* argp中。
TIOCNXCL void
禁用独占模式。

Line discipline

TIOCGETD int *argp
获取终端的线路规则。
TIOCSETD const int *argp
设置终端的线路规则。

Pseudoterminal ioctls

TIOCPKT const int *argp
启用(当 * argp为非零)或禁用数据包模式。只能应用于伪终端的主端(否则将返回ENOTTY)。在数据包模式下,每个后续的read(2)将返回一个数据包,该数据包要么包含单个非零控制字节,要么具有包含零的单个字节(aq \ 0aq),后跟写入伪终端从属端的数据。如果第一个字节不是TIOCPKT_DATA(0),则为以下一个或多个位的OR:
TIOCPKT_FLUSHREAD   The read queue for the terminal is flushed.
TIOCPKT_FLUSHWRITE  The write queue for the terminal is flushed.
TIOCPKT_STOP        Output to the terminal is stopped.
TIOCPKT_START       Output to the terminal is restarted.
TIOCPKT_DOSTOP      The start and stop characters are haS/haQ.
TIOCPKT_NOSTOP      The start and stop characters are not haS/haQ.
在使用分组模式时,可以通过select(2)(用于特殊条件)或poll(2)(用于POLLPRI事件)检测要从主控端读取的控制状态信息的存在。
rlogin(1)和rlogind(8)使用此模式来实现远程响应的,本地haS / haQ流控制的远程登录。
TIOCGPKT const int *argp
(从Linux 3.8开始) 以argp指向的整数返回当前数据包模式设置。
TIOCSPTLCK int *argp
设置(如果 * argp为非零)或删除(如果* argp为零)伪终端从设备上的锁。 (另请参见unlockpt(3)。)
TIOCGPTLCK int *argp
(从Linux 3.8开始) 将伪终端从设备的当前锁定状态放置在argp指向的位置。
TIOCGPTPEER int flags
(从Linux 4.13开始) 给定fd中的文件描述符,该文件描述符引用伪终端主机,则打开(使用给定的open(2)样式标志),并返回一个新文件描述符,该文件描述符引用对等伪终端从属设备。无论从设备的路径名是否可以通过调用进程的安装名称空间访问,都可以执行此操作。
与名称空间交互的注重安全的程序可能希望使用此操作,而不要使用ptsname(3)返回的路径名的open(2)以及具有不安全API的类似库函数。 (例如,在某些情况下,使用ptsname(3)的路径名可能会将devpts文件系统挂载在另一个挂载名称空间中,从而造成混乱。)

BSD ioctl TIOCSTOPTIOCSTARTTIOCUCNTL,TIOCREMOTE尚未在Linux下实现。

Modem control

TIOCMGET int *argp
获取调制解调器位的状态。
TIOCMSET const int *argp
设置调制解调器位的状态。
TIOCMBIC const int *argp
清除指示的调制解调器位。
TIOCMBIS const int *argp
设置指示的调制解调器位。

上述ioctl使用以下位:

TIOCM_LE        DSR (data set ready/line enable)
TIOCM_DTR       DTR (data terminal ready)
TIOCM_RTS       RTS (request to send)
TIOCM_ST        Secondary TXD (transmit)
TIOCM_SR        Secondary RXD (receive)
TIOCM_CTS       CTS (clear to send)
TIOCM_CAR       DCD (data carrier detect)
TIOCM_CD         see TIOCM_CAR
TIOCM_RNG       RNG (ring)
TIOCM_RI         see TIOCM_RNG
TIOCM_DSR       DSR (data set ready)
TIOCMIWAIT int arg
等待4个调制解调器位(DCD,RI,DSR,CTS)中的任何一个改变。 通过将任意比特值TIOCM_RNGTIOCM_DSR,TIOCM_CD和TIOCM_CTS进行"或"运算,可以将感兴趣的比特指定为arg中的比特掩码。调用方应使用TIOCGICOUNT查看哪一位已更改。
TIOCGICOUNT struct serial_icounter_struct *argp
获取输入串行线路中断(DCD,RI,DSR,CTS)的计数。 计数将写入argp指向的serial_icounter_struct结构。
注意:1->0和0->1转换都被计数,但RI除外,RI仅计数0->1转换。

Marking a line as local

TIOCGSOFTCAR int *argp
("获取软件载体标志") 在termios结构的c_cflag字段中获取CLOCAL标志的状态。
TIOCSSOFTCAR const int *argp
("设置软件载体标志") * argp非零时,请在termios结构中设置CLOCAL标志,否则将其清除。

如果某行的CLOCAL标志关闭,则硬件载波检测(DCD)信号有效,除非给出O_NONBLOCK标志,否则相应终端的open(2)将阻塞,直到断言DCD。如果设置了CLOCAL,则该行的行为就好像始终声明DCD。通常,对于本地设备,软件载体标志是打开的,对于具有调制解调器的线路,软件载体标志是关闭的。

Linux-specific

有关TIOCLINUX ioctl的信息,请参见ioctl_console(2)。

Kernel debugging

#包括

TIOCTTYGSTRUCT struct tty_struct *argp
得到 tty_struct对应于fd。在Linux 2.5.67中已删除此命令。

返回值

ioctl(2)系统调用成功返回0。错误时,它返回-1并适当地设置errno。

错误说明

EINVAL
无效的命令参数。
ENOIOCTLCMD
未知的命令。
ENOTTY
不合适的FD。
EPERM
权限不足。

示例

检查串口上DTR的状态。

#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int
main(void)
{
    int fd, serial;

    fd = open("/dev/ttyS0", O_RDONLY);
    ioctl(fd, TIOCMGET, &serial);
    if (serial & TIOCM_DTR)
        puts("TIOCM_DTR is set");
    else
        puts("TIOCM_DTR is not set");
    close(fd);
}

另外参见

ldattach(1),ioctl(2),ioctl_console(2),termios(3),pty(7)

出版信息

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