首页  >  文章  >  后端开发  >  如何在 Linux 中实现非阻塞键盘输入:kbhit() 和 getch() 等效项指南

如何在 Linux 中实现非阻塞键盘输入:kbhit() 和 getch() 等效项指南

Susan Sarandon
Susan Sarandon原创
2024-10-29 01:11:30675浏览

How to Achieve Non-Blocking Keyboard Input in Linux: A Guide to kbhit() and getch() Equivalents

使用 kbhit() 和 getch() 等效项在 Linux 中访问键盘输入

提供的 Windows 代码利用特定于平台的函数 _kbhit( ) 和 _getch() 来监视键盘输入而不中断程序循环。然而,这些函数在 Linux 系统上不可用,需要替代方法。

POSIX 兼容的 kbhit() 等效项

如果您的 Linux 系统缺少 conio.h 标头支持 kbhit(),请考虑利用 Morgan Mattews 的实现。此解决方案在任何符合 POSIX 标准的系统上模拟 kbhit() 功能。

解决 getchar() 问题

在 termios 级别停用缓冲不仅可以解决 kbhit()问题还解决了与 getchar() 相关的任何问题,如所提供的资源中所示。这种方法确保立即接收输入,而无需等待 Enter 按键。

与示例代码集成

要使提供的示例代码适应 Linux 系统,请考虑替换 _kbhit () 和 _getch() 及其符合 POSIX 标准的等效项。下面修改后的代码演示了这种集成:

<code class="cpp">#include <termios.h>
#include <unistd.h>
#include <iostream>

int main()
{
    // Disable input buffering
    termios oldt, newt;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);

    while (true)
    {
        if (kbhit())
        {
            char c = getchar();
            if (c == 'g')
            {
                std::cout << "You pressed G" << std::endl;
            }
        }
        sleep(500);
        std::cout << "Running" << std::endl;
    }

    // Restore input buffering
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

    return 0;
}</code>

此修改后的代码利用 Mattews 的 kbhit() 实现并停用输入缓冲来实现与原始 Windows 代码类似的功能。

以上是如何在 Linux 中实现非阻塞键盘输入:kbhit() 和 getch() 等效项指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn