Как создать программу, которая будет реагировать на нажатие кнопок (например, «more» на «q»)

Как создать программу, которая будет реагировать на нажатие кнопок (например, «more» на «q»)

Я пытаюсь понять, как работают утилиты pg\more\less. Например, cat somebigfile | more. More теперь в интерактивном режиме. Его таблица fd: 0 (чтение конвейера из cat) 1 (stdout) 2 (stderr)

Я могу открыть /dev/tty на 3 fd и читать команды оттуда. Но больше могут выполнять некоторые действия без нажатия Enter. На Linux я могу использовать ncurses. Что мне нужно понять, чтобы сделать это на Solaris?

решение1

Основная идея заключается в том, чтобы прочитать() один символ из вашего ввода; см.http://bazaar.launchpad.net/~vcs-imports/util-linux-ng/trunk/view/head:/text-utils/more.c#L1908в качестве примера (который я обнаружил через результаты поиска Googlehttps://stackoverflow.com/questions/9854267/реализация-больше-unix-utility-command):

int readch(void)
{
    unsigned char c;

    errno = 0;
    if (read(fileno(stderr), &c, 1) <= 0) {
        if (errno != EINTR)
            end_it(0);
        else
            c = otty.c_cc[VKILL];
    }
    return (c);
}

Связанный контент