- 論壇徽章:
- 11
|
要修復(fù)這個(gè)問題,先reset,還不行就只能重登陸了。
問題原因就是終端輸入輸出模式不正確了,正常shell交互是canon模式(行為單位,命令行編輯),vi/more/less使用的時(shí)非canon模式(字符為單位,支持單個(gè)字符的操作),kill -9 'sh -c ...'打破了more正常退出邏輯,所以有問題,細(xì)節(jié)看下面分析。
正常q退出more,strace看到icanon和echo設(shè)置了吧,這是一般shell正常交互的關(guān)鍵。- 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
復(fù)制代碼 先kill -9 'sh -c ...',再q退出more,strace看到icanon和echo沒有設(shè)置成功- read(2, "q", 1) = 1
- ioctl(2, SNDCTL_TMR_START or TCSETS, {B9600 opost isig icanon echo ...}) = -1 EIO (Input/output error)
復(fù)制代碼 至于為什么會(huì)失?終端/偽終端水太深,就到此為止吧,不管什么動(dòng)機(jī),直接kill -9 'sh -c ...'都是不合理的,和system更是一毛錢關(guān)系沒有。 |
|