Как выбрать на сокете, используя libreadline?

Я пишу C-программу, которая представляет "псевдо-терминал" пользователю, где он может вводить специальные команды, а также должен прослушивать данные из UDP-сокета.

В настоящее время я использую вызов select() для выбора на STDIN и дескриптор сокета. Когда он возвращается, я использую макрос FD_ISSET(), чтобы определить, должна ли программа отвечать на данные команды пользователя или сокета.

while (1) {
    fd_set fs;
    FD_ZERO(&fs);
    FD_SET(0, &fs);  // stdin.
    FD_SET(socket, &fs);

    int ret = select(s + 1, &fs, NULL, NULL, NULL);

    if (FD_ISSET(0, &fs)) { /* handle terminal command from stdin. */ }

    if (FD_ISSET(socket, &fs)) { /* handle socket data. */ }
}

Я хочу использовать библиотеку GNU readline для реализации терминала, чтобы я мог воспользоваться его историей и функциями завершения табуляции. Кажется, однако, что функция readline() использует свой собственный метод для чтения из stdin, и я не вижу способа также выбрать в UDP-сокете.

Кто-нибудь знает способ сделать это?

Спасибо!

1 ответ

Readline предоставляет способ сделать это: http://www.delorie.com/gnu/docs/readline/rlman_41.html

В основном ваш код в порядке. Вам нужно вызвать функцию инициализации, а затем, где у вас есть /* handle terminal command from stdin. */, ты звонишь rl_callback_read_char(),

Вы можете увидеть простой пример в этом ответе: ncurses и stdin blocking

Другие вопросы по тегам