我有一个用 C 语言编写的小应用程序,旨在在 Linux 上运行。该应用程序的一部分接受来自键盘的用户输入,并且它使用非规范的终端模式,以便它可以响应每个击键。
接受输入的代码部分是一个在循环中重复调用的简单函数:
char get_input()
{
char c = 0;
int res = read(input_terminal, &c, 1);
if (res == 0) return 0;
if (res == -1) { /* snip error handling */ }
return c;
}
这从终端读取单个字符。如果在特定时间范围内未收到输入(由 termios 结构中的 c_cc[VTIME] 值指定),read() 返回 0,并再次调用 get_input()。
这一切都很好,除了我最近发现,如果你在终端窗口中运行这个应用程序,然后在不终止应用程序的情况下关闭终端窗口,应用程序不会退出但会进入 CPU 密集型无限循环,读取() 不等待,连续返回0。
那么,如果应用程序是从终端窗口运行的,那么我怎样才能让应用程序正常退出,然后终端窗口关闭呢?问题是 read() 从不返回 -1,因此错误条件与 read() 返回 0 的正常情况无法区分。所以我看到的唯一解决方案是放入一个计时器,并假设存在错误条件,如果read 返回 0 的速度比 c_cc[V_TIME] 中指定的时间快。但该解决方案充其量似乎很老套,我希望有更好的方法来处理这种情况。
有什么想法或建议吗?
最佳答案
您是否在程序退出前捕获信号并重置内容?我认为 SIGHUP 是你需要关注的。可能在信号处理程序中设置一个开关,如果从 read() 返回时开关打开,则清理并退出。
关于非规范终端 I/O 应用程序的 Linux 终端问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1184878/