【问题标题】:GNU Readline: Is there a function that cancels readline input request?GNU Readline:是否有取消 readline 输入请求的功能?
【发布时间】:2014-12-26 20:35:19
【问题描述】:

我是 GNU Readline 的新手,所以我想知道是否存在可以取消 readline() 请求的函数?

【问题讨论】:

  • 好吧,因为readline 函数是阻塞,并不是真的。您可能可以使用多个线程来完成它并向终端发送中断。另外,您能否详细说明一下为什么要“取消”该功能?

标签: c linux libreadline


【解决方案1】:

为此,您必须使用alternate(或“回调”)接口来读取行。实际上没有必要取消任何事情,您只需(暂时)跳出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 */
    }
  }
}

如果您想在没有按键的情况下“取消”,则必须使用信号中断rl_callback_read_char() 内的read() 系统调用(例如,通过设置alarm())。但是请注意,readline installs its own signal handlers

稍微复杂一点的方法是在两个文件描述符stdin和例如select()的循环中插入一个select()。一个管道(self-pipe trick),使用第二个描述符(和/或超时)来“唤醒”select(),然后像下面的示例一样跳出循环..

【讨论】:

  • 这是一个很好的例子。谢谢! :)
猜你喜欢
  • 2015-03-10
  • 2010-11-06
  • 1970-01-01
  • 2010-12-03
  • 2022-07-19
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多