使用系统调用后重置(stty raw)

时间:2017-05-08 20:48:24

标签: c call system reset stty

我使用以下代码来读取和输出每次击键,而不必每次都按Enter键。

system("\bin\stty raw");

在我读完之后,程序再次进行系统调用以重置终端行为。

system("\bin\stty cooked");

问题是,最后一行没有按原样重置终端行为。一旦该程序终止,一切都搞砸了。它会继续读取输入,并且一旦按下Enter或CTRL C或其他任何内容,它就不会执行任何操作。

如何将终端行为重置为最初的行为?

1 个答案:

答案 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()?)