我使用以下代码来读取和输出每次击键,而不必每次都按Enter键。
system("\bin\stty raw");
在我读完之后,程序再次进行系统调用以重置终端行为。
system("\bin\stty cooked");
问题是,最后一行没有按原样重置终端行为。一旦该程序终止,一切都搞砸了。它会继续读取输入,并且一旦按下Enter或CTRL C或其他任何内容,它就不会执行任何操作。
如何将终端行为重置为最初的行为?
答案 0 :(得分:1)
使用popen()
和pclose()
运行"/bin/stty -g"
。阅读stty -g
]的输出并保存以供日后使用。
如果要重置终端,请使用"/bin/stty the-string-from-stty-g"
。
机制很繁琐但可行。
stty
的-g
选项的重点是提供一个字符串,该字符串可以传回stty
以恢复当前设置。然后,您可以运行stty raw
,确保在使用stty -g
中的字符串退出之前重置终端。
另请注意,stty sane
可以很好地将异常终端重置为已知状态。您可能需要在终端命令行运行: Control-J stty sane
Control-J 以使其正常工作。
您也可以在不运行外部程序的情况下执行此操作。您需要查看tcgetattr()
和
tcsetattr()
及相关职能。再次,您阅读当前设置(tcgetattr()
等),更改它们的副本并将其设置为新值,并确保在退出时重置原始设置(可能使用atexit()
?)