Как остановить эхо в терминале, используя c? - PullRequest
1 голос
/ 27 января 2020

Предположим, я читаю строку, используя fgets, и хочу предотвратить внутреннее отображение символов этой строки в терминале (без bash трюков). Как я могу это сделать?

1 Ответ

5 голосов
/ 27 января 2020

Если вы работаете в POSIX-совместимой ОС, вам нужно поиграть с флагами локального терминала управления (термин ios) для stdin, используя tcgetattr() и tcsetattr():

#include <stdio.h>
#include <termios.h>

int main(int argc, char *argv[])
{
    printf("Enter password: ");

    struct termios term;
    tcgetattr(fileno(stdin), &term);

    term.c_lflag &= ~ECHO;
    tcsetattr(fileno(stdin), 0, &term);

    char passwd[32];
    fgets(passwd, sizeof(passwd), stdin);

    term.c_lflag |= ECHO;
    tcsetattr(fileno(stdin), 0, &term);

    printf("\nYour password is: %s\n", passwd);
}

Возможно, вы захотите отключить дополнительные флаги во время ввода. Это всего лишь пример. Остерегайтесь прерываний - вы действительно хотите сбросить состояние терминала, даже если ваша программа прервана.

Также это, вероятно, может работать не для всех типов tty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...