IOCTL_TTY - Linux手册页
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就像TCGETS,TCSETS,TCSETSW,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)。
- 有关参数值TCOOFF,TCOON,TCIOFF,TCION,请参见tcflow(3)。
Buffer count and flushing
- FIONREAD int *argp
- 获取输入缓冲区中的字节数。
- TIOCINQ int *argp
- 和...一样 FIONREAD。
- TIOCOUTQ int *argp
- 获取输出缓冲区中的字节数。
- TCFLSH int arg
- 相当于 tcflush(fd,arg)。
- 有关参数值TCIFLUSH,TCOFLUSH,TCIOFLUSH,请参见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 TIOCSTOP,TIOCSTART,TIOCUCNTL,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_RNG,TIOCM_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/。