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