我是GNU Readline的新手,所以我想知道是否存在一个可以取消readline()
请求的函数?
要做到这一点,你必须使用备用 (或“回调”)接口readline。 实际上没有必要取消任何东西,只是(暂时)退出rl_callback_read_char
的循环来做任何需要做的事情。 这甚至可以在用户发送一个ENTER 之前发生,但只能在按键之后 。
#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 */ } } }
如果你想在没有按键的情况下“取消”,你必须使用一个信号(例如通过设置一个alarm()
)来中断rl_callback_read_char()
的read()
系统调用。 但请注意,readline 会安装自己的信号处理程序 。
一个稍微复杂的方法是在两个文件描述符( stdin
和一个管道( 自管道技巧 )上插入一个select()
来使用这个第二个描述符(和/或超时) “的select()
,然后走出循环,就像下面的例子..