Как выбрать на сокете, используя 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