termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed – 获取和设置终端特点,行操控,获取和设置波特率
SYNOPSIS 总览
#include
#include
int tcgetattr(int
int tcsetattr(int fd, int optional_actions, struct termios *termios_p);
int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int act
int cfmakeraw(struct termios *termios_p);
speed_t cfgetispeed(struct termios *termios_p);
speed_t cfgetospeed(struct termios *termios_p);
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
DESCRIPTION 描绘
termios 函数族供给了一个惯例的终端接口,用于操控非同步通讯端口。
这儿描绘的大部分特点有一个 termios_p 类型的参数,它是指向一个 termios 结构的指针。这个结构包含了至少下列成员:
tcflag_t c_iflag; /* 输入形式 */
tcflag_t c_oflag; /* 输出形式 */
tcflag_t c_cflag; /* 操控形式 */
tcflag_t c_lflag; /* 本地形式 */
cc_t c_cc[NCCS]; /* 操控字符 */
c_iflag 标志常量:
IGNBRK
疏忽输入中的 BREAK 状况。
BRKINT
假如设置了 IGNBRK,将疏忽 BREAK。假如没有设置,可是设置了 BRKINT,那么 BREAK 将使得输入和输出行列被改写,假如终端是一个前台进程组的操控终端,这个进程组中一切进程将收到 SIGINT 信号。假如既未设置 IGNBRK 也未设置 BRKINT,BREAK 将视为与 NUL 字符同义,除非设置了 PARMRK,这种情况下它被视为序列 \377 \0 \0。
IGNPAR
疏忽桢过错和奇偶校验错。
PARMRK
假如没有设置 IGNPAR,在有奇偶校验错或桢过错的字符前刺进 \377 \0。假如既没有设置 IGNPAR 也没有设置 PARMRK,将有奇偶校验错或桢过错的字符视为 \0。
INPCK
启用输入奇偶检测。
ISTRIP
去掉第八位。
INLCR
将输入中的 NL 翻译为 CR。
IGNCR
疏忽输入中的回车。
ICRNL
将输入中的回车翻译为新行 (除非设置了 IGNCR)。
IUCLC
(不属于 POSIX) 将输入中的大写字母映射为小写字母。
IXON
启用输出的 XON/XOFF 流操控。
IXANY
(不属于 POSIX.1;XSI) 答应任何字符来从头开端输出。(?)
IXOFF
启用输入的 XON/XOFF 流操控。
IMAXBEL
(不属于 POSIX) 当输入行列满时响零。Linux 没有完成这一位,总是将它视为已设置。
POSIX.1 中界说的 c_oflag 标志常量:
OPOST
启用详细完成自行界说的输出处理。
其他 c_oflag 标志常量界说在 POSIX 1003.1-2001 中,除非别的阐明。
OLCUC
(不属于 POSIX) 将输出中的小写字母映射为大写字母。
ON
(XSI) 将输出中的新行符映射为回车-换行。
OCRNL
将输出中的回车映射为新行符
ON
不在第 0 列输出回车。
ON
不输出回车。
OFILL
发送填充字符作为延时,而不是运用守时来延时。
OFDEL
(不属于 POSIX) 填充字符是 ASCII DEL (0177)。假如不设置,填充字符则是 ASCII NUL。
NLDLY
新行延时掩码。取值为 NL0 和 NL1。
CRDLY
回车延时掩码。取值为 CR0, CR1, CR2, 或 CR3。
TABDLY
水平跳格延时掩码。取值为 TAB0, TAB1, TAB2, TAB3 (或 XTABS)。取值为 TAB3,即 XTABS,将扩展跳格为空格 (每个跳格符填充 8 个空格)。(?)
BSDLY
回退延时掩码。取值为 BS0 或 BS1。(从来没有被完成过)
VTDLY
竖直跳格延时掩码。取值为 VT0 或 VT1。
FFDLY
进表延时掩码。取值为 FF0 或 FF1。
c_cflag 标志常量:
CBAUD
(不属于 POSIX) 波特率掩码 (4+1 位)。
CBAUDEX
(不属于 POSIX) 扩展的波特率掩码 (1 位),包含在 CBAUD 中。
(POSIX 规则波特率存储在 termios 结构中,并未准确指定它的方位,而是供给了函数 cfgetispeed() 和 cfsetispeed() 来存取它。一些体系运用 c_cflag 中 CBAUD 挑选的位,其他体系运用独自的变量,例如 sg_ispeed 和 sg_ospeed 。)
CSIZE
字符长度掩码。取值为 CS5, CS6, CS7, 或 CS8。
CSTOPB
设置两个间断位,而不是一个。
CREAD
翻开承受者。
PARENB
答应输出产生奇偶信息以及输入的奇偶校验。
PARODD
输入和输出是奇校验。
HUPCL
在最终一个进程封闭设备后,下降 modem 操控线 (挂断)。(?)
CLOCAL
疏忽 modem 操控线。
LOBLK
(不属于 POSIX) 从非当时 shell 层堵塞输出(用于 shl )。(?)
CIBAUD
(不属于 POSIX) 输入速度的掩码。CIBAUD 各位的值与 CBAUD 各位相同,左移了 IBSHIFT 位。
CRTSCTS
(不属于 POSIX) 启用 RTS/CTS (硬件) 流操控。
c_lflag 标志常量:
ISIG
当承受到字符 INTR, QUIT, SUSP, 或 DSUSP 时,产生相应的信号。
ICANON
启用规范形式 (canonical mode)。答应运用特别字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和 WERASE,以及按行的缓冲。
XCASE
(不属于 POSIX; Linux 下不被支撑) 假如一起设置了 ICANON,终端只要大写。输入被转换为小写,除了以 \ 前缀的字符。输出时,大写字符被前缀 \,小写字符被转换成大写。
ECHO
回显输入字符。
ECHOE
假如一起设置了 ICANON,字符 ERASE 擦除前一个输入字符,WERASE 擦除前一个词。
ECHOK
假如一起设置了 ICANON,字符 KILL 删去当时行。
ECHONL
假如一起设置了 ICANON,回显字符 NL,即便没有设置 ECHO。
ECHOCTL
(不属于 POSIX) 假如一起设置了 ECHO,除了 TAB, NL, START, 和 STOP 之外的 ASCII 操控信号被回显为 ^X, 这儿 X 是比操控信号大 0x40 的 ASCII 码。例如,字符 0x08 (BS) 被回显为 ^H。
ECHOPRT
(不属于 POSIX) 假如一起设置了 ICANON 和 IECHO,字符在删去的一起被打印。
ECHOKE
(不属于 POSIX) 假如一起设置了 ICANON,回显 KILL 时将删去一行中的每个字符,好像指定了 ECHOE 和 ECHOPRT 相同。
DEFECHO
(不属于 POSIX) 只在一个进程读的时分回显。
FLUSHO
(不属于 POSIX; Linux 下不被支撑) 输出被改写。这个标志能够经过键入字符 DISCARD 来开关。
NOFLSH
制止在产生 SIGINT, SIGQUIT 和 SIGSUSP 信号时改写输入和输出行列。
TOSTOP
向企图写操控终端的后台进程组发送 SIGTTOU 信号。
PENDIN
(不属于 POSIX; Linux 下不被支撑) 在读入下一个字符时,输入行列中一切字符被从头输出。(bash 用它来处理 typeahead)
IEXTEN
启用完成自界说的输入处理。这个标志有必要与 ICANON 一起运用,才干解说特别字符 EOL2,LNEXT,REPRINT 和 WERASE,IUCLC 标志才有用。
c_cc 数组界说了特别的操控字符。符号下标 (初始值) 和意义为:
VINTR
(003, ETX, Ctrl-C, or also 0177, DEL, rubout) 间断字符。宣布 SIGINT 信号。当设置 ISIG 时可被辨认,不再作为输入传递。
VQUIT
(034, FS, Ctrl-\) 退出字符。宣布 SIGQUIT 信号。当设置 ISIG 时可被辨认,不再作为输入传递。
VERASE
(0177, DEL, rubout, or 010, BS, Ctrl-H, or also #) 删去字符。删去上一个还没有删掉的字符,但不删去上一个 EOF 或行首。当设置 ICANON 时可被辨认,不再作为输入传递。
VKILL
(025, NAK, Ctrl-U, or Ctrl-X, or also @) 中止字符。删去自上一个 EOF 或行首以来的输入。当设置 ICANON 时可被辨认,不再作为输入传递。
VEOF
(004, EOT, Ctrl-D) 文件尾字符。更准确地说,这个字符使得 tty 缓冲中的内容被送到等候输入的用户程序中,而不用比及 EOL。假如它是一行的榜首个字符,那么用户程序的 read() 将回来 0,指示读到了 EOF。当设置 ICANON 时可被辨认,不再作为输入传递。
VMIN
非 canonical 形式读的最小字符数。
VEOL
(0, NUL) 附加的行尾字符。当设置 ICANON 时可被辨认。
VTIME
非 canonical 形式读时的延时,以十分之一秒为单位。
VEOL2
(not in POSIX; 0, NUL) 另一个行尾字符。当设置 ICANON 时可被辨认。
VSWTCH
(not in POSIX; not supported under Linux; 0, NUL) 开关字符。(只为 shl 所用。)
VSTART
(021, DC1, Ctrl-Q) 开端字符。从头开端被 Stop 字符间断的输出。当设置 IXON 时可被辨认,不再作为输入传递。
VSTOP
(023, DC3, Ctrl-S) 间断字符。间断输出,直到键入 Start 字符。当设置 IXON 时可被辨认,不再作为输入传递。
VSUSP
(032, SUB, Ctrl-Z) 挂起字符。发送 SIGTSTP 信号。当设置 ISIG 时可被辨认,不再作为输入传递。
VDSUSP
(not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延时挂起信号。当用户程序读到这个字符时,发送 SIGTSTP 信号。当设置 IEXTEN 和 ISIG,而且体系支撑作业办理时可被辨认,不再作为输入传递。
VLNEXT
(not in POSIX; 026, SYN, Ctrl-V) 字面上的下一个。引证下一个输入字符,撤销它的任何特别意义。当设置 IEXTEN 时可被辨认,不再作为输入传递。
VWERASE
(not in POSIX; 027, ETB, Ctrl-W) 删去词。当设置 ICANON 和 IEXTEN 时可被辨认,不再作为输入传递。
VREPRINT
(not in POSIX; 022, DC2, Ctrl-R) 从头输出未读的字符。当设置 ICANON 和 IEXTEN 时可被辨认,不再作为输入传递。
VDISCARD
(not in POSIX; not supported under Linux; 017, SI, Ctrl-O) 开关:开端/完毕丢掉未完成的输出。当设置 IEXTEN 时可被辨认,不再作为输入传递。
VSTATUS
(not in POSIX; not supported under Linux; status request: 024, DC4, Ctrl-T).
这些符号下标值是互不相同的,除了 VTIME,VMIN 的值或许别离与 VEOL,VEOF 相同。 (在 non-canonical 形式下,特别字符的意义更改为延时意义。MIN 表明应当被读入的最小字符数。TIME 是以十分之一秒为单位的计时器。假如一起设置了它们,read 将等候直到至少读入一个字符,一旦读入 MIN 个字符或许从前次读入字符开端经过了 TIME 时刻就当即回来。假如只设置了 MIN,read 在读入 MIN 个字符之前不会回来。假如只设置了 TIME,read 将在至少读入一个字符,或许计时器超时的时分当即回来。假如都没有设置,read 将当即回来,只给出当时准备好的字符。) (?)
tcgetattr() 得到与 fd 指向的目标相关的参数,将它们保存于 termios_p 引证的 termios 结构中。函数能够从后台进程中调用;可是,终端特点或许被后来的前台进程所改动。
tcsetattr() 设置与终端相关的参数 (除非需求底层支撑却无法满意),运用 termios_p 引证的 termios 结构。optional_actions 指定了什么时分改动会起作用:
TCSANOW
改动当即产生
TCSADRAIN
改动在一切写入 fd 的输出都被传输后收效。这个函数应当用于修正影响输出的参数时运用。
TCSAFLUSH
改动在一切写入 fd 引证的目标的输出都被传输后收效,一切已承受但未读入的输入都在改动产生前丢掉。
tcsendbreak() 传送接连的 0 值比特流,继续一段时刻,假如终端运用异步串行数据传输的话。假如 duration 是 0,它至少传输 0.25 秒,不会超越 0.5 秒。假如 duration 非零,它发送的时刻长度由完成界说。
假如终端并非运用异步串行数据传输,tcsendbreak() 什么都不做。
tcdrain() 等候直到一切写入 fd 引证的目标的输出都被传输。
tcflush() 丢掉要写入 引证的目标,可是没有传输的数据,或许收到可是没有读取的数据,取决于 queue_selector 的值:
TCIFLUSH
改写收到的数据可是不读
TCOFLUSH
改写写入的数据可是不传送
TCIOFLUSH
一起改写收到的数据可是不读,而且改写写入的数据可是不传送
tcflow() 挂起 fd 引证的目标上的数据传输或接纳,取决于 act
TCOOFF
挂起输出
TCOON
从头开端被挂起的输出
TCIOFF
发送一个 STOP 字符,间断终端设备向体系传送数据
TCION
发送一个 START 字符,使终端设备向体系传输数据
翻开一个终端设备时的默认设置是输入和输出都没有挂起。
波特率函数被用来获取和设置 termios 结构中,输入和输出波特率的值。新值不会立刻收效,直到成功调用了 tcsetattr() 函数。
设置速度为 B0 使得 modem “挂机”。与 B38400 相应的实践比特率能够用 setserial(8) 调整。
输入和输出波特率被保存于 termios 结构中。
cfmakeraw 设置终端特点如下:
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
|INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;
cfgetospeed() 回来 termios_p 指向的 termios 结构中存储的输出波特率
cfsetospeed() 设置 termios_p 指向的 termios 结构中存储的输出波特率为 speed。取值有必要是以下常量之一:
B0
B50
B75
B110
B134
B150
B200
B300
B600
B1200
B1800
B2400
B4800
B9600
B19200
B38400
B57600
B115200
B230400
零值 B0 用来间断衔接。假如指定了 B0,不应当再假定存在衔接。一般,这样将断开衔接。CBAUDEX 是一个掩码,指示高于 POSIX.1 界说的速度的那一些 (57600 及以上)。因而,B57600 & CBAUDEX 为非零。
cfgetispeed() 回来 termios 结构中存储的输入波特率。
cfsetispeed() 设置 termios 结构中存储的输入波特率为 speed。假如输入波特率被设为0,实践输入波特率将等于输出波特率。
RETURN VALUE 回来值
cfgetispeed() 回来 termios 结构中存储的输入波特率。
cfgetospeed() 回来 termios 结构中存储的输出波特率。
其他函数回来:
0
成功
-1
失利,而且为 errno 置值来指示过错。
留意 tcsetattr() 回来成功,假如任何所要求的修正能够完成的话。因而,当进行多重修正时,应当在这个函数之后再次调用 tcgetattr() 来检测是否一切修正都成功完成。
NOTES 留意
Unix V7 以及许多后来的体系有一个波特率的列表,在十四个值 B0, …, B9600 之后能够看到两个常数 EXTA, EXTB (“External A” and “External B”)。许多体系将这个列表扩展为更高的波特率。
tcsendbreak 中非零的 duration 有不同的作用。SunOS 指定间断 duration*N 秒,其间 N 至少为 0.25,不高于 0.5 。Linux, AIX, DU, Tru64 发送 duration 微秒的 break 。FreeBSD, NetBSD, HP-UX 以及 MacOS 疏忽 duration 的值。在 Solaris 和 Unixware 中, tcsendbreak 调配非零的 duration 作用类似于 tcdrain。
SEE ALSO 拜见
stty(1), setserial(8)