AR28/AR46系列路由器作为终端接入服务器出现终端死锁问题的解决方法
问题现象:
在某省农行终端接入测试时发现有时会出现终端无法杀死的现象。ttyd程序能从socket接收数据并发送到pty设备,但是在前置机上echo字符不下去,也就是说,前置机上无法将数据写入tty设备。
问题原因:
Linux对于流控的处理存在一个问题:当数据中含有0x13(流控字符)的时候,会导致tty设备堵塞,大部分情况可以通过发送0x11(在终端按CTRL+Q解除流控)来解决,但一些情况下发送0x11也不能解决问题,分别使用tcflush和tcflow都不能解决流控的问题。所以对于流控的情况,可以有几种选择:
a、修改ttyd程序,把0x13字符过滤掉,因为只要是数据中含有0x13就会导致tty堵塞;
b、可以修改agetty程序,设置终端属性为非流控;在agetty的主函数main()的调用函数中设置变量termio为:
termio->c_cc[VSTART] = 0;
termio->c_cc[VSTOP] = 0;
注:
1、agetty主函数所在文件:usr/src/packages/SOURCES/util-linux-2.11u/login-utils/agetty.c
2、以上修改基于:Linux suse8 2.4.19-4GB
3、修改完后需要重新编译生成agetty和login可执行程序。
c、可以修改login程序,也是设置终端属性为非流控。可参照agetty中流控的修改方法。
规避方法:
对于使用ttyd4.17及更高版本的情况,可以如下处理:
a、对于采用8芯线的情况,可以通过配置auto-close 5的方法,当出现终端死机的情况,开关一次终端来复位终端。
b、对于采用3芯线的情况,可以通过配置reset-key的方法,当出现终端死机的情况,输入复位键来复位终端。
该案例暂时没有网友评论
✖
案例意见反馈
亲~登录后才可以操作哦!
确定你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作