Ikb*_*bel 2 c linux libreadline
我是GNU 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 */
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想在没有按键的情况下"取消",你必须 使用信号中断read()系统调用rl_callback_read_char()(例如通过设置alarm()).但请注意,readline 会安装自己的信号处理程序.
一个稍微复杂的方法将是插入到环中的select()上2个文件描述符,stdin和例如配管(在自管特技),以使用该第二描述符(和/或超时),以"唤醒" select(),和然后走出循环,就像下面的例子中一样.