GNU Readline을 처음 사용하기 때문에 readline()
요청을 취소 할 수있는 기능이 있는지 알고 싶습니다.GNU Readline : readline 입력 요청을 취소하는 함수가 있습니까?
2
A
답변
5
이렇게하려면 readline에 alternate (또는 "콜백") 인터페이스를 사용해야합니다. 실제로 아무 것도 취소 할 필요가 없습니다. 수행해야 할 모든 작업을 수행하려면 rl_callback_read_char
주위의 루프에서 단계적으로 빠져 나와야합니다. 심지어 전에 사용자가 보낸 있지만 키를 후 경우에만 보낼 수 있습니다. 당신이 키도 누르지 않고이 "취소"하려면
#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은 installs its own signal handlers입니다.
약간 더 복잡한 방법은 루프에 삽입하는 것 두 select()
에 파일 디스크립터, 및 예컨대 stdin
파이프합니다 (self-pipe trick)는`readline에 보낸 .. 바로 아래 예와 같이, 루프 밖으로 나오 다음 음
+0
이것은 어떻게하는지 보여주는 좋은 예입니다. 고맙습니다! :) – Ikbel
을
select()
를 "웨이크 업"하기 위해 (및/또는 타임 아웃)이 두 번째 디스크립터를 사용하는 '함수는 * 차단 *입니다. 여러 개의 스레드를 사용하여 터미널에 인터럽트를 보낼 수 있습니다. 또한, 당신은 * 왜 * 당신이 기능을 "취소"하려고하는지 자세히 설명해 주시겠습니까? –