非规范终端 I/O 应用程序的 Linux 终端问题

标签 linux terminal termios

我有一个用 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/

相关文章:

编译器测试失败,gcc on redhat

php - 如何在 linux 机器上使用独立数据库?

python - 无法升级 pip

linux - Mac OS X 终端 - 我该如何 "clear | java foo"?

macos - 如何在 Mac 上恢复 .bash_profile?我的 unix 终端都没有工作

C termios 和 printf 问题

linux - forkpty 适用于某些终端应用程序,不适用于其他应用程序

php - 如何计算单个文件中的代码行数

regex - 返回具有 grep 匹配的制表符分隔的 csv 文件的整列

c++ - 使用 C 对串行 AT 命令的响应较慢,但使用 minicom 响应速度较快