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

C 使用系统调用后重置(stty raw),c,call,system,reset,stty,C,Call,System,Reset,Stty,我使用下面的代码来读取和输出每个击键,而无需每次按enter键 system("\bin\stty raw"); 在我读完之后,程序立即执行另一个系统调用来重置终端行为 system("\bin\stty cooked"); 问题是,最后一行并没有像它应该的那样重置终端行为。一旦这个程序终止,一切都会变得一团糟。按下enter或CTRL C或其他任何键后,它将继续读取输入,并且不会执行任何操作 如何将终端行为重置为最初的行为 使用popen()和pclose()运行“/bin/stty-g”

我使用下面的代码来读取和输出每个击键,而无需每次按enter键

system("\bin\stty raw");
在我读完之后,程序立即执行另一个系统调用来重置终端行为

system("\bin\stty cooked");
问题是,最后一行并没有像它应该的那样重置终端行为。一旦这个程序终止,一切都会变得一团糟。按下enter或CTRL C或其他任何键后,它将继续读取输入,并且不会执行任何操作

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

使用
popen()
pclose()
运行
“/bin/stty-g”
。从
stty-g
]读取输出,并将其保存以备将来使用

要重置终端时,请使用
“/bin/stty the-string-from-stty-g”

这些机制很精细,但可行

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

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

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

system
函数不是系统调用。
“\b”
是退格。@EugeneSh。嗯,这是一个系统调用,与
abs(-5)
是一个abs调用和
printf(“hello\n”)
是一个printf调用的意义相同。这种含糊不清的说法可能会让人困惑,但并不是不正确的。