问题
I'm new to GNU Readline, so I want to know if there exist a function that can cancel readline()
request?
回答1:
To do this, you'll have to use the alternate (or "callback") interface to readline. There is actually no need to cancel anything, you just (temporarily) step out of the loop around rl_callback_read_char
to do whatever needs to be done. This can even happen before the user has sent an ENTER, but only after a keypress.
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
void line_handler(char *line) { /* This function (callback) gets called by readline
whenever rl_callback_read_char sees an ENTER */
printf("%s? Hah!!\n", line);
}
int main() {
rl_callback_handler_install("Ask a question: ", &line_handler);
while (1) {
rl_callback_read_char();
if (strstr(rl_line_buffer, "you")) { /* They're asking about *me* =:-0 */
printf("\nNo personal questions please! Goodbye!\n");
break;
/* or make a snarky remark and continue */
}
}
}
If you want to "cancel" without a keypress, you'll have to interrupt the read()
syscall inside the rl_callback_read_char()
using a signal (e.g. by setting an alarm()
). Be aware, however, that readline installs its own signal handlers.
A slightly more sophisticated method would be to insert into the loop a select()
on two file descriptors, stdin
and e.g. a pipe (the self-pipe trick), to use this second descriptor (and/or a timeout) to "wake up" the select()
, and then step out of the loop just like in the example below..
来源:https://stackoverflow.com/questions/27661706/gnu-readline-is-there-a-function-that-cancels-readline-input-request