大龙的博客

常用链接

统计

最新评论

stty学习记

简洁方式,显示波特率
stty
speed 38400 baud; line = 0;
eol = M-^?; eol2 = M-^?; swtch = M-^?;
ixany iutf8



显示全部设置的命令
stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke


重要一点
    属性前面的减号表示被禁止
    没有减号说明使能


上面一堆在struct termios{} 中有对应位,或者对应字符,c_cc[]内为对应字符

在include/asm-i386/termbits.h中定义这个结构及相应位

struct termios {
    tcflag_t c_iflag;        /* input mode flags */
    tcflag_t c_oflag;        /* output mode flags */
    tcflag_t c_cflag;        /* control mode flags */
    tcflag_t c_lflag;        /* local mode flags */
    cc_t c_line;            /* line discipline */
    cc_t c_cc[NCCS];        /* control characters */
};

输入模式
c_iflag包含如下标志:
/* c_iflag bits */
#define IGNBRK    0000001
#define BRKINT    0000002
#define IGNPAR    0000004
#define PARMRK    0000010
#define INPCK    0000020
#define ISTRIP    0000040
#define INLCR    0000100
#define IGNCR    0000200
#define ICRNL    0000400
#define IUCLC    0001000
#define IXON    0002000
#define IXANY    0004000
#define IXOFF    0010000
#define IMAXBEL    0020000
#define IUTF8    0040000


brkint     中断时发出 INTR 信号。
-brkint     中断时不发出 INTR 信号。
icrnl     输入时将 CR 映射为 NL。
-icrnl     输入时不将 CR 映射为 NL。
ignbrk     输入时忽略 BREAK。
-ignbrk     输入时不忽略 BREAK。
igncr     输入时忽略 CR。
-igncr     输入时不忽略 CR。
ignpar     忽略奇偶错误。
-ignpar     不忽略奇偶错误。
inlcr     输入时将 NL 映射为 CR。
-inlcr     输入时不将 NL 映射为 CR。
inpck     启用奇偶校验。
-inpck     禁用奇偶校验。
istrip     将输入字符剥离到 7 位。
-istrip     不将输入字符剥离到 7 位。
iuclc     将大写字母字符映射为小写。
-iuclc     不将大写字母字符映射为小写。
ixany     允许任何字符重新启动输出。
-ixany     只允许 START(Ctrl-Q 按键顺序)重新启动输出。
ixoff     当输入队列接近空或满时,发送 START/STOP 字符。
-ixoff     不发送 START/STOP 字符。
ixon         启用 START/STOP 输出控制。一旦启用 START/STOP 输出控制,
            您可以按下 Ctrl-S 按键顺序暂停向工作站的输出,也可按下 Ctrl-Q 按键顺序恢复输出。
-ixon     禁用 START/STOP 输出控制。
imaxbel     当输入溢出时,回送 BEL 字符并且废弃最后的输入字符。
-imaxbel 当输入溢出时,废弃所有输入。
parmrk     标记奇偶错误。
-parmrk     不标记奇偶错误[1]。



输出模式
c_oflag包含如下标志:
/* c_oflag bits */
#define OPOST    0000001
#define OLCUC    0000002
#define ONLCR    0000004
#define OCRNL    0000010
#define ONOCR    0000020
#define ONLRET    0000040
#define OFILL    0000100
#define OFDEL    0000200
#define NLDLY    0000400
#define   NL0    0000000
#define   NL1    0000400
#define CRDLY    0003000
#define   CR0    0000000
#define   CR1    0001000
#define   CR2    0002000
#define   CR3    0003000
#define TABDLY    0014000
#define   TAB0    0000000
#define   TAB1    0004000
#define   TAB2    0010000
#define   TAB3    0014000
#define   XTABS    0014000
#define BSDLY    0020000
#define   BS0    0000000
#define   BS1    0020000
#define VTDLY    0040000
#define   VT0    0000000
#define   VT1    0040000
#define FFDLY    0100000
#define   FF0    0000000
#define   FF1    0100000


bs0, bs1                  为退格符选择延迟样式(bs0 表示没有延迟)。
cr0,  cr1, cr2, cr3     为 CR 字符选择延迟样式(cr0 表示没有延迟)。
ff0, ff1     为换页选择延迟样式(ff0 表示没有延迟)。
nl0, nl1     为 NL 字符选择延迟样式(nl0 表示没有延迟)。
ofill     使用延迟填充字符。
-ofill     使用延迟定时。
ocrnl     将 CR 字符映射为 NL 字符。
-ocrnl     不将 CR 字符映射为 NL 字符。
olcuc     输出时将小写字母字符映射为大写。
-olcuc     输出时不将小写字母字符映射为大写。
onlcr     将 NL 字符映射为 CR-NL 字符。
-onlcr     不将 NL 字符映射为 CR-NL 字符。
onlret     在终端 NL 执行 CR 功能。
-onlret     在终端 NL 不执行 CR 功能。
onocr     不在零列输出 CR 字符。
-onocr     在零列输出 CR 字符。
opost     处理输出。
-opost     不处理输出;即忽略所有其它输出选项。
ofdel     使用 DEL 字符作为填充字符。
-ofdel     使用 NUL 字符作为填充字符。
tab0, tab1, tab2     为水平制表符选择延迟样式(tab0 表示没有延迟)。
tab3                     扩展制表符至多个空格。
vt0, vt1             为垂直制表符选择延迟样式(vt0 表示没有延迟)[1]。


控制模式
/* c_cflag bit meaning */
#define CBAUD    0010017
#define  B0    0000000        /* hang up */
#define  B50    0000001
#define  B75    0000002
#define  B110    0000003
#define  B134    0000004
#define  B150    0000005
#define  B200    0000006
#define  B300    0000007
#define  B600    0000010
#define  B1200    0000011
#define  B1800    0000012
#define  B2400    0000013
#define  B4800    0000014
#define  B9600    0000015
#define  B19200    0000016
#define  B38400    0000017
#define EXTA B19200
#define EXTB B38400
#define CSIZE    0000060
#define   CS5    0000000
#define   CS6    0000020
#define   CS7    0000040
#define   CS8    0000060
#define CSTOPB    0000100
#define CREAD    0000200
#define PARENB    0000400
#define PARODD    0001000
#define HUPCL    0002000
#define CLOCAL    0004000
#define CBAUDEX 0010000
#define    B57600 0010001
#define   B115200 0010002
#define   B230400 0010003
#define   B460800 0010004
#define   B500000 0010005
#define   B576000 0010006
#define   B921600 0010007
#define  B1000000 0010010
#define  B1152000 0010011
#define  B1500000 0010012
#define  B2000000 0010013
#define  B2500000 0010014
#define  B3000000 0010015
#define  B3500000 0010016
#define  B4000000 0010017
#define CIBAUD      002003600000    /* input baud rate (not used) */
#define CMSPAR      010000000000        /* mark or space (stick) parity */
#define CRTSCTS      020000000000        /* flow control */

clocal      假定一行没有调制解调器控制。
-clocal     假定一行带有调制解调器控制。
cread     启用接收器。
-cread     禁用接收器。
cstopb     每个字符选择两个停止位。
-cstopb     每个字符选择一个停止位。
cs5, cs6, cs7, cs8     选择字符大小。
hup, hupcl     最后关闭时挂起拨号连接。
-hup, -hupcl     最后关闭时不挂起拨号连接。
parenb     启用奇偶性校验的生成和检测。
-parenb     禁用奇偶性校验的生成和检测。
parodd     选择奇校验。
-parodd     选择偶校验。
0     立即挂起电话线路。
speed     将工作站输入和输出速度设置为指定的 speed 数(以位/秒为单位)。
            并不是所有的硬件接口都支持所有的速度。
            speed 的可能值有:50、75、110、134、200、300、600、1200、1800、
            2400、4800、9600、19200、19.2、38400、38.4、exta 和  extb。
注:
exta、19200 和 19.2 是同义词;extb、38400 和 38.4 是同义词。
ispeed speed     将工作站输入速度设置为指定的 speed 数(以位/秒为单位)。
                    并不是所有的硬件接口都支持所有的速度,而且并不是所有的硬件接口都支持该选项。
                    speed 的可能值与 speed 选项相同。
ospeed speed     将工作站输出速度设置为指定的 speed 数(以位/秒为单位)。
                    并不是所有的硬件接口都支持所有的速度,而且并不是所有的硬件接口都支持该选项。
                    speed 的可能值与 speed 选项相同[1]。


本地模式
/* c_lflag bits */
#define ISIG    0000001
#define ICANON    0000002
#define XCASE    0000004
#define ECHO    0000010
#define ECHOE    0000020
#define ECHOK    0000040
#define ECHONL    0000100
#define NOFLSH    0000200
#define TOSTOP    0000400
#define ECHOCTL    0001000
#define ECHOPRT    0002000
#define ECHOKE    0004000
#define FLUSHO    0010000
#define PENDIN    0040000
#define IEXTEN    0100000


echo      回送每个输入的字符。
-echo     不回送字符。
echoctl     以 ^X(Ctrl-X)回送控制字符,X 是将 100 八进制加到控制字符代码中给出的字符。
-echoctl     不以 ^X(Ctrl-X)回送控制字符。
echoe     以“backspace space backspace”字符串回送 ERASE 字符。
注:
该模式不保持对列位置的跟踪,因此您可能在擦除制表符和转义序列等符号时得到意外的结果。
-echoe     不回送 ERASE 字符,只回送退格符。
echok     在 KILL 字符后回送 NL 字符。
-echok     在 KILL 字符后不回送 NL 字符。
echoke     通过擦除输出行上的每个字符,回送 KILL 字符。
-echoke     只回送 KILL 字符。
echonl     回送 NL 字符。
-echonl     不回送 NL 字符。
echoprt     以 /(斜杠)和 \ (反斜杠) 向后回送擦除的字符。
-echoprt     不以 /(斜杠)和 \ (反斜杠) 向后回送擦除的字符。
icanon     启用规范输入(规范输入允许使用 ERASE 和 KILL 字符进行输入行的编辑)。
            请参阅 AIX 5L Version 5.2 Communications Programming Concepts 中的
             Line Discipline Module (ldterm) 中关于 canonical mode input 的讨论。
-icanon     禁用规范输入。
iexten     指定从输入数据中识别实现性定义的功能。
            要识别以下控制字符,
            需要设置 iexten:eol2、dsusp、reprint、discard、werase、lnext。
            与这些模式关联的功能也需要设置 iexten:imaxbel、echoke、echoprt、echoctl。
-iexten     指定从输入数据中识别实现性定义的功能。
isig         启用对特殊控制字符(INTR、SUSP 和 QUIT 特殊控制字符)的字符检查。
-isig     禁用对特殊控制字符(INTR、SUSP 和 QUIT 特殊控制字符)的字符检查。
noflsh     不清除 INTR、SUSP 或 QUIT 控制字符之后的缓冲区。
-noflsh     清除 INTR、SUSP 或 QUIT 控制字符之后的缓冲区。
pending     下次读操作暂挂或输入到达时,要重新输入从原始模式转换为规范模式后被暂挂的输入。
            暂挂是一个内部状态位。
-pending     没有文本暂挂。
tostop     为背景输出发出 SIGTOU 信号。
-tostop     不为背景输出发出 SIGTOU 信号。
xcase     在输入中回送大写字符,并在输出显示的大写字符之前加上 \ (反斜杠)。
-xcase     不在输入时回送大写字符[1]。



控制字符
/* c_cc characters */
#define VINTR 0
#define VQUIT 1
#define VERASE 2
#define VKILL 3
#define VEOF 4
#define VTIME 5
#define VMIN 6
#define VSWTC 7
#define VSTART 8
#define VSTOP 9
#define VSUSP 10
#define VEOL 11
#define VREPRINT 12
#define VDISCARD 13
#define VWERASE 14
#define VLNEXT 15
#define VEOL2 16
控制指定
要将一个控制字符指定到某字符串中,请输入:
stty Control String
其中,Control 参数可以是 INTR、QUIT、ERASE、KILL、EOF、EOL、EOL2、START、STOP、
SUSP、DSUSP、REPRINT、DISCARD、WERASE、
LNEXT、MIN 或 TIME 参数。(使用字符 MIN 和 TIME 时,请加上 -icanon 选项。)[1]




试验

打印出终端的行数和列数
stty size
24 80
即24行,80列

stty cols 25
把列设为25行,发现输出变窄
stty -a
speed 38400 baud;
rows 24; columns 25;
line = 0;
intr = ^C; quit = ^\;
erase = ^?; kill = ^U;
eof = ^D; eol = <undef>;
eol2 = <undef>;
swtch = <undef>;
start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V;
flush = ^O;
min = 1; time = 0;
-parenb -parodd cs8 hupcl
-cstopb cread -clocal
-crtscts
-ignbrk brkint ignpar
-parmrk -inpck istrip
-inlcr -igncr icrnl ixon
-ixoff -iuclc -ixany
imaxbel -iutf8
opost -olcuc -ocrnl onlcr
-onocr -onlret -ofill
-ofdel nl0 cr0 tab0 bs0
vt0 ff0
isig icanon iexten echo
echoe echok -echonl
-noflsh -xcase -tostop
-echoprt echoctl echoke





stty speed
显示速率

stty intr c
c变为中断键,想输入c不可能了。


stty raw
发现ctrl+c不管用了,输出混乱
允许原始模式输入(不包括输入处理,例如 erase、kill 或 interrupt);传回奇偶(校验)位。

stty -raw
允许规范输入方式。

在命令行下,禁止输出大写的方法
stty iuclc #开启
stty -iuclc #恢复

在命令行下禁止输出小写
stty olcuc #开启
stty -olcuc#恢复

stty sane
将参数重新设置为合理的值。

忽略回车符
stty igncr #开启
发现enter不起作用了,要显示执行效果,需用ctrl+j

stty -igncr#恢复,要显示执行效果,需用ctrl+j

stty erase x
退格删除键变成x,想输入x,不可能了,因为x是退格键
stty erase ^?返回原来退格键

stty -echo
发现按键,什么也没有出现
stty echo
输入显示


stty -icanon
关闭驱动程序中的规范模式处理,跳过缓冲层,用户不能删除字符,

测试一下
gui.c
#include<stdio.h>
main()
{
    char c;
    FILE *fp_tty;
    fp_tty=fopen("/dev/tty","r");
    if(fp_tty==NULL)
        exit(1);
    while((c=getc(fp_tty))!=EOF)
    {
        printf("%d",c);
    }
}

gcc gui.c -o gui

stty icanon
./gui
d
10010f
10210d
10010f
10210
可以用退格键,并且显示数字还得按回车键, 从10(  enter)就可以看出来

stty -icanon
./gui
d100f102g103h104
10

关闭规范模式后发现,按退格键不管用,并且直接显示,不用按回车键

posted on 2007-12-03 01:01 大龙 阅读(1430) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理