2014-12-26 2 views
2

GNU Readline을 처음 사용하기 때문에 readline() 요청을 취소 할 수있는 기능이 있는지 알고 싶습니다.GNU Readline : readline 입력 요청을 취소하는 함수가 있습니까?

+2

select()를 "웨이크 업"하기 위해 (및/또는 타임 아웃)이 두 번째 디스크립터를 사용하는 '함수는 * 차단 *입니다. 여러 개의 스레드를 사용하여 터미널에 인터럽트를 보낼 수 있습니다. 또한, 당신은 * 왜 * 당신이 기능을 "취소"하려고하는지 자세히 설명해 주시겠습니까? –

답변

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