关闭然后在Linux下打开C中的标准输入

时间:2016-07-12 12:34:29

标签: c linux terminal console

我在Linux下有一个C控制台应用程序(Raspbian - Raspberry Pi)。该程序有一些角色动画 - 它逐字符地打印出消息。例如,文本

  

请告诉我你的名字!

在5秒后完全打印出来(char by char)。

之后,要求用户输入他们的姓名,如果用户等待打印出来的消息,该名称就可以正常工作。但是,如果用户不耐烦并随机点击键盘上的键,则输入请求将会受到影响。

想象一下用户输入

  

ABC \ nefgh \ n

而上述文字正在回显('\ n'表示新行 - 输入)。如果发生这种情况,将不会要求用户正确输入他/她的名字,但字符数组'abc'将被接受作为输入并得到验证。

我的问题是如何暂时禁用输入(缓冲)(在Linux上)。我已经尝试了几种方法并阅读了很多关于这样做的帖子,但是没有一个方法可以用于我的目的。

负责要求输入的功能如下:

int getLine(char *s, int length)
{
    int i;
    char c;

    for (i = 0; i < length && (c = getchar()) != EOF && c != '\n'; i++)
    {
        if (c == '\0')
        {
            i--;
        }
        else
        {
            s[i] = c;
        }
    }

    s[i] = '\0';

    while (c != EOF && c != '\n')
    {
        c = getchar();
    }

    return i;
}

在调用上面的函数的函数中使用while循环消除空行,因此输入输入被视为无效。

我尝试关闭stdin,但无法重新打开它:

fclose(stdin);

并在getLine

之前清空缓冲区
char buf[BUFSIZ];
while (c = fgets(buf, BUFSIZ, stdin) != NULL);

不幸的是,它不像文本文件那样有效。

fflush(stdin);也不起作用,反正也不好。

我的目标是防止用户在写出文本时输入任何内容,并暂时忽略/关闭输入缓冲(stdin)。此外,在打印过程中禁用输出(刷新)用户输入会很好,因为它会在Linux终端上显示。

1 个答案:

答案 0 :(得分:1)

您可以通过直接与TTY交互来完成此操作。查看passwd或类似实用程序的源代码以获取灵感。

下面的函数清除TTY输入缓冲区(省略错误处理)。您需要在阅读用户输入之前调用它。

#include <sys/ioctl.h>
#include <termios.h>

void clear_user_input() {
  if (isatty(STDIN_FILENO)) {
    int fd = open(ttyname(STDIN_FILENO), O_RDONLY);
    ioctl(fd, TCFLSH, TCIFLUSH);
    close(fd);
  }
}