我想在提示用户之前耗尽终端输入,或者在我想提示用户输入之前关闭终端输入。
我正在编写一个程序,它使用 sys_read
提示用户通过终端进行输入。如果用户在被提示之前键入字符,这些字符将包含在输入中。我可以在提示后再次使用 sys_read
轻松耗尽每个未读字符,但它依赖于输入流末尾的返回字符以防止多次提示用户(我假设用户每结束一次用回车键提示)。我不能依赖提示前的返回字符的存在,所以我不能以同样的方式排出输入。
我也试过用 sys_close
关闭标准输入,但我不知道如何再次打开终端输入,所以当出现提示时程序被冻结。即使我可以再次打开终端输入,我也不确定在关闭时输入的字符是否仍会在下次读取时保存,这会使这种方法完全无用。
如果有某种模糊的 termios 标志可以禁用用户输入,那也是一个很好的解决方案。
这是一个程序,例如:
global _start
_start:
mov edx,ldot
mov ecx,mdot
mov ebx,1
mov eax,4 ; sys_write
int 0x80
mov dword[sleep_sec],1
mov dword[sleep_usec],0
mov ecx,0
mov ebx,sleep
mov eax,162 ; sys_nanosleep
int 0x80
mov edx,ldesire
mov ecx,mdesire
mov ebx,1
mov eax,4 ; sys_write
int 0x80
call input ; here's the call...
mov edx,lreceive
mov ecx,mreceive
mov ebx,1
mov eax,4 ; sys_write
int 0x80
mov dword[sleep_sec],1
mov dword[sleep_usec],0
mov ecx,0
mov ebx,sleep
mov eax,162 ; sys_nanosleep
int 0x80
mov edx,99
mov ecx,inputed
mov ebx,1
mov eax,4 ; sys_write
int 0x80
mov eax,1 ; sys_exit
int 0x80 ; the end!
input: ; here is all that I am concerned about
mov edx,99
mov ecx,inputed
mov ebx,0 ; stdin
mov eax,3 ; sys_read
int 0x80
cmp eax,99 ; check for valid input
jl inputdone
cmp byte[inputed+98],0xa
je inputdone
inputclear: ; drain
mov eax,3
int 0x80
cmp eax,99
jl inputerror
cmp byte[inputed+98],0xa
je inputerror
jmp inputclear
inputerror:
mov eax,-1
ret
inputdone:
mov eax,1
ret
section .bss
inputed resb 99
section .data
sleep:
sleep_sec dd 0
sleep_usec dd 0
mdot db '...',0xA
ldot equ $ - mdot
mdesire db 'tell me your truest desire:'
ldesire equ $ - mdesire
mreceive db 'you shall receive... '
lreceive equ $ - mreceive
听命于做事的用户不会有任何问题:
...
tell me your truest desire:money
you shall receive... money
但是喜欢按自己喜欢的按钮的用户会很挣扎:
...
a gtell me your truest desire:love
you shall receive... a glove
而且程序不会等待任何弄乱返回键的人:
...
who
tell me your truest desire:you shall receive... who