终端特殊输入字符

终端支持下表所示的特殊输入字符。
[img]http://dl2.iteye.com/upload/attachment/0129/7813/8d8e24f5-a84a-3c1e-836c-911bc74a8b9b.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0129/7815/fa5e28a3-1c44-3ffc-b058-4e7925208481.png[/img]
为了更改,只需要修改 termios 结构(见[url=http://aisxyz.iteye.com/admin/blogs/2422412]终端 I/O 综述[/url]一节)中 c_cc 数组的相应项,该数组中的元素都用上表中第 3 列中的名字作为下标进行引用。若将 c_cc 数组中的某项设置为 _POSIX_VDISABLE 值,则禁止使用相应的特殊字符。
下面是一个更改特殊字符的示例程序,它会禁用中断字符,并将文件结束符设置为 Ctrl+B。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>

int main(void){
if(isatty(STDIN_FILENO) == 0){
printf("standard input is not a terminal device\n");
exit(1);
}
long vdisable = fpathconf(STDIN_FILENO, _PC_VDISABLE);
if(vdisable < 0){
printf("fpathconf error or _POSIX_VDISABLE not in effect\n");
exit(1);
}
struct termios term;
if(tcgetattr(STDIN_FILENO, &term) < 0){ // fetch tty state
printf("tcgetattr error\n");
exit(1);
}
term.c_cc[VINTR] = vdisable; // disable INTR character
term.c_cc[VEOF] = 2; // EOF now is Control-B
if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &term) < 0){
printf("tcsetattr error\n");
exit(1);
}
exit(0);
}

对此程序要说明以下几点:
1、仅当标准输入是终端设备时才能修改其终端特殊字符。使用 isatty 函数可对此进行检测。
2、使用了 fpathconf 函数获取 _POSIX_VDISABLE 的值,以免在系统不支持时直接赋值该值报错。
3、先后分别使用 gcgetattr 和 tcsetattr 函数来确保只修改希望修改的属性,而其他属性保持不变。
4、禁用中断键与忽略中断信号是不同的。禁用中断键只是禁用了使终端驱动程序产生 SIGINT 信号的特殊字符,但仍可使用 kill 函数来将该信号发送至进程。
下面将详细说明各特殊输入字符,但要注意其中 STOP 和 START(Ctrl+S 和 Ctrl+Q)在输出时也要进行特殊处理。另外,其中的大多数字符在被终端驱动程序识别并进行特殊处理后就会被丢弃,并不将它们返回给执行读终端操作的进程。返回给读进程的例外字符是换行符(NL、EOL、EOL2)和回车符(CR)。
* CR:回车符。以规范模式进行输入时识别此字符。在已设置 ICANON(规范模式) 和 ICRNL(将 CR 映射为 NL)但并未设置 IGNCR(忽略 CR)时,CR 字符会被转换成 NL。此字符会返回给读进程(很可能是在转换为 NL 后)。
* DISCARD:丢弃符。在扩充模式(IEXTEN)下进行输入时识别。在输入另一个 DISCARD 之前或在丢弃条件被清除之前(见 FLUSHO 选项),此字符使后续输出都被丢弃。
* DSUSP:延迟挂起作业控制符(delayed-suspend job-control character)。在扩充模式(IEXTEN)下,若支持作业控制,且已设置 ISIG 标志,则在输入时识别此字符。它与 SUSP 字符的相同之处是:产生 SIGTSTP 信号,并将该信号发送至前台进程组中的所有进程。但是,信号产生的时间并不是在键入延迟挂起字符之时,而是在某个进程从控制终端读到此字符时才产生。
* EOF:文件结束符。以规范模式(ICANON)进行输入时识别此字符。当键入此字符时,等待被读的所有字节都被立即传送给读进程。如果没有字节等待读就返回 0。
* EOL/EOL2:附加的行定界符。作用同 NL。
* ERASE/ERASE2:向前擦除字符(退格)。以规范模式(ICANON)输入时识别此字符。
* INTR:中断字符。若已设置 ISIG 标志,则在输入中识别此字符。它将产生的 SIGINT 信号发送至前台进程组中的所有进程。
* KILL:行擦除符。以规范模式(ICANON)输入时识别。它擦除一整行。
* LNEXT:下一个字符的字面值(literal-next character)。以扩充模式(IEXTEN)输入时识别。它使下一个字符的任何特殊含义都被忽略。使用该字符可向程序键入任何字符。它在处理后即被丢弃,但输入的下一个字符会被传送给读进程。
* NL:换行符,也称为行定界符。以规范模式(ICANON)输入时识别。
* QUIT:退出字符。若已设置 ISIG 标志,则在输入中识别此字符。它将产生的 SIGQUIT 信号发送至前台进程组中的所有进程。它与 INTR 的区别是:它不仅按默认规则终止进程,而且还产生一个 core 文件。
* REPRINT:再打印字符。以扩充规范模式(设置了 IEXTEN 和 ICANON 标志)进行输入时识别。它使所有未读的输入被输出(再回显)。
* START:启动字符。若已设置 IXON 标志,则在输入中识别;若已设置 IXOFF 标志,则自动产生此字符作为输出。已设置 IXON 时,接收到的 START 使停止的输出(由以前输入的 STOP 字符造成)重新启动。此种情形下,此字符在处理后即被丢弃。已设置 IXOFF 时,若新的输入不会使输入缓冲区溢出,则终端驱动程序自动产生一个 START 字符来恢复以前被停止的输入。
* STATUS:BSD 的状态请求字符。以扩充规范模式(设置了 IEXTEN 和 ICANON)进行输入时识别。它将产生的 SIGINFO 信号发送至前台进程组中的所有进程。另外,如果没有设置 NOKERNINFO 标志,则有关前台进程组的状态信息也显示在终端上。
* STOP:停止字符。若已设置 IXON 标志,则在输入中识别;若已设置 IXOFF 标志,则自动产生此字符作为输出。已设置 IXON 时,接收到 STOP 会停止输出。此种情形下,此字符在处理后即被丢弃。已设置 IXOFF 时,终端驱动程序自动产生一个 STOP 字符以防止输入缓冲区溢出。
* SUSP:挂起作业控制字符。若支持作业控制并且已设置 ISIG 标志,则在输入中识别。它将产生的 SIGTSTP 信号发送至前台进程组中所有进程。
* WERASE:字擦除字符。以扩充规范模式(设置了 IEXTEN 和 ICANON)进行输入时识别。它使前一个字被擦除。通常,前一个记号在碰到一个空白符时即终止,但可通过设置 ALTWERASE 标志(见[url=http://aisxyz.iteye.com/admin/blogs/2422412]终端 I/O 综述[/url]中的 c_lflag 标志表)来使前一个记号在碰到第一个非字母、非数字字符时即终止。
另外,需要为终端设备定义的另一个“字符”是 BREAK。BREAK 实际上并不是一个字符,而是在异步串行数据传送时发生的一个条件。根据串行接口的不同,可以有多种方式通知设备驱动程序发生了 BREAK 条件。对于异步串行数据传送,BREAK 是一个 0 值的位序列,其持续时间长于要求发送一个字节的时间。整个 0 值位序列被视为是一个 BREAK。可以使用函数 tcsendbreak 来发送一个 BREAK。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
=============================================================================== 南京工程学院 - 校园网802.1X客户端 - 项目简介 ------------------------------------------------------------------------------- 本项目旨在解决使用Linux操作系统登陆华为802.1X校园网络的问题 兼容iNode V2.40-F0335,支持华为客户端版本号加密认证,支持用户名中存在特殊字符 目前njit-client在以下学校运行良好(感谢网友热心反馈): 南京工程学院、中南财经政法大学、华北电力大学、广东工业大学、长安大学 湖南大学 如果您发现客户端在您学校无法使用,请在我们802.1X客户端开发小组的讨论板留言, http://groups.google.com/group/njit8021xclient?hl=zh-CN 或发送Email到我们的公共邮箱: [email protected] 开发小组成员会及时与您取得联系 [使用方法] 假设您的Linux系统里的普通用户名为liuqun,内网802.1X帐号为s-12345、密码为abcde 一、把可执行文件njit-client和njit-RefreshIP拷贝到用户主目录(假设为/home/liuqun目录). 二、从开始菜单里找到“终端”,打开后进入命令提示符窗口 三、通过命令行切换为root并运行njit-client程序 Ubuntu下命令格式为: sudo ./njit-client s-12345 abcde RedHat/Fedora下命令格式为 su -c "./njit-client s-12345 abcde" 四、程序会输出一些调试信息(因目前仍是测试版本),其中大部分信息不用理会, 只需关注如果包括[*] Server: Success.这样一行提示即为802.1X认证成功 如果提示为Server: Failure则为认证失败,另外还会输出"E????: ",这是服务器 发来的提示信息。 下面是客户端程序运行成功时输出的部分调试信息(测试地点为南京工程学院): [ ] Client: Start. [1] Server: Request Notification! Client: Response Notification. [2] Server: Request Identity! [2] Client: Response Identity. [3] Server: Request MD5-Challenge! [3] Client: Response MD5-Challenge. [4] Server: (H3C data) [4] Server: Success. 《debug_msg from="./njit-RefreshIP" func="__main__"》 Hal Device: /org/freedesktop/Hal/devices/net_00_16_36_52_53_12 net.interface = "eth0" NetworkManager Connection: /org/freedesktop/NetworkManagerSettings/0 connection.id = "System eth0" Activated Connection: /org/freedesktop/NetworkManager/ActiveConnection/7 《/debug_msg》 [1] Server: Request Identity! [1] Client: Response Identity. [5] Server: Request Identity! [5] Client: Response Identity. [1] Server: Request Identity! [1] Client: Response Identity. [6] Server: Request Identity! [6] Client: Response Identity. 五、如果你们学校配置的是动态分配IP地址,客户端程序会自动通知操作系统获取IP地址。 但如果学校分配的是静态IP地址,则还需要手动设置。 如果你需要帮助,请联系校园网802.1X客户端开发小组(发送Email至: njit8021xclient@googlegroups

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值