我有一个用 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 密集型无限循环,其中 read() 连续无需等待即可返回 0。
那么,如果应用程序从终端窗口运行,然后关闭终端窗口,我怎样才能让应用程序正常退出呢?问题是 read() 永远不会返回 -1,因此错误情况与 read() 返回 0 的正常情况无法区分。所以我看到的唯一解决方案是放入一个计时器,并假设如果出现错误情况read 返回 0 的速度比 c_cc[V_TIME] 中指定的时间快。但是这个解决方案充其量似乎很老套,我希望有更好的方法来处理这种情况。
有什么想法或建议吗?