我正在使用以下代码来读取和输出每个击键,而不必每次都按 enter。
system("\bin\stty raw");
在我读完之后,程序会执行另一个系统调用来重置终端行为。
system("\bin\stty cooked");
问题是,最后一行没有按照应有的方式重置终端行为。一旦这个程序终止,一切都会变得一团糟。它继续读取输入,一旦按下回车键或 CTRL C 或其他任何东西,它就不会做任何事情。
如何将终端行为重置为最初的行为?
使用popen()
和pclose()
运行"/bin/stty -g"
. 从 ] 读取输出stty -g
并将其保存以备后用。
当您要重置终端时,请使用"/bin/stty the-string-from-stty-g"
.
机制很繁琐但可行。
-g
选项的全部意义stty
在于提供一个字符串,该字符串可以传回stty
以恢复当前设置。然后,您可以运行您的stty raw
,确保在退出之前使用字符串 from 重置终端stty -g
。
还要注意,这stty sane
可以很好地将异常终端重置为已知状态。您可能需要Control-Jstty sane
Control-J在终端命令行运行:以使其工作。
您也可以在不运行外部程序的情况下执行此操作。您需要查看tcgetattr()
和
tcsetattr()
相关的功能。再次,您阅读当前设置(tcgetattr()
等),更改它们的副本并将其设置为新值,并确保在退出时重置原始设置(可能使用atexit()
?)。