【问题标题】:Reset after using system call (stty raw)使用系统调用后重置(stty raw)
【发布时间】:2017-10-07 00:13:35
【问题描述】:

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

system("\bin\stty raw");

在我读完之后,程序会执行另一个系统调用来重置终端行为。

system("\bin\stty cooked");

问题是,最后一行没有按照应有的方式重置终端行为。一旦这个程序终止,一切都会变得一团糟。它继续读取输入,一旦按下回车键或 CTRL C 或其他任何东西,它就不会做任何事情。

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

【问题讨论】:

  • system 函数不是系统调用。
  • "\b" 是退格键。
  • @EugeneSh。嗯,这是一个系统调用,就像abs(-5) 是一个abs 调用和printf("hello\n") 是一个printf 调用一样。模棱两可可能令人困惑,但并非不正确。

标签: c call system reset stty


【解决方案1】:

使用popen()pclose() 运行"/bin/stty -g"。读取来自stty -g] 的输出并保存以备后用。

当你想重置终端时,使用"/bin/stty the-string-from-stty-g"

机制很复杂但可行。

-g 选项对stty 的全部意义在于提供一个可以传递回stty 以恢复当前设置的字符串。然后您可以运行您的stty raw,确保在退出之前使用stty -g 中的字符串重置终端。

还要注意,stty sane 在将异常终端重置为已知状态方面做得很好。您可能需要在终端命令行运行:Control-Jstty saneControl-J 以使其工作。

您也可以在不运行外部程序的情况下执行此操作。您需要查看tcgetattr()tcsetattr() 及相关功能。同样,您阅读当前设置(tcgetattr() 等),更改它们的副本并将其设置为新值,并确保在退出时重置原始设置(可能使用atexit()?)。

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多