- 论坛徽章:
- 11
|
要修复这个问题,先reset,还不行就只能重登陆了。
问题原因就是终端输入输出模式不正确了,正常shell交互是canon模式(行为单位,命令行编辑),vi/more/less使用的时非canon模式(字符为单位,支持单个字符的操作),kill -9 'sh -c ...'打破了more正常退出逻辑,所以有问题,细节看下面分析。
正常q退出more,strace看到icanon和echo设置了吧,这是一般shell正常交互的关键。- read(2, "q", 1) = 1
- ioctl(2, SNDCTL_TMR_START or TCSETS, {B9600 opost isig icanon echo ...}) = 0
- ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 opost isig icanon echo ...}) = 0
复制代码 先kill -9 'sh -c ...',再q退出more,strace看到icanon和echo没有设置成功- read(2, "q", 1) = 1
- ioctl(2, SNDCTL_TMR_START or TCSETS, {B9600 opost isig icanon echo ...}) = -1 EIO (Input/output error)
复制代码 至于为什么会失败?终端/伪终端水太深,就到此为止吧,不管什么动机,直接kill -9 'sh -c ...'都是不合理的,和system更是一毛钱关系没有。 |
|