Как изменить символ эха в терминале Linux - PullRequest
1 голос
/ 01 мая 2019

Я заинтересован в получении пароля от пользователя.

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

void changeEcho() {
    termios term;
    tcgetattr(STDIN_FILENO, &term);
    term.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &term);
}

Я знаю, что это отключит эхо, но мне интересно повторить что-то, что я выберу, в моем случае '*'.

1 Ответ

3 голосов
/ 01 мая 2019

Функция, которую вы описываете, не связана с эхом.Вместо этого вы реализуете его самостоятельно, просто читая символ и записывая * в цикле:

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


int main() {
    char c;
    char p = '*';
    struct termios term, original;
    tcgetattr(STDIN_FILENO, &term);
    original = term;
    term.c_lflag &= ~ECHO & ~ICANON;
    tcsetattr(STDIN_FILENO, TCSANOW, &term);

    while (read(STDIN_FILENO, &c, 1) == 1 && c != '\n')
        write(STDOUT_FILENO, &p, 1);
    printf("\n");

    tcsetattr(STDIN_FILENO, TCSANOW, &original);
    return 0;
}

Когда вы запускаете его и набираете что-то, все, что вы видите, это * s:

$ gcc foo.c && ./foo
***********

Программа должна хранить строку, обрабатывать клавишу возврата и отображать только один * на многобайтовый символ.

...