用信号中断c / c ++ readline

我试图用信号(SIGUSR1)中断readline,但显然如果没有处理信号,程序退出,处理时,readline继续进行,好像什么也没发生。 读取线应该能够使用信号中断。

我从另一个问题中得到了一个想法: 强制退出readline()函数

#include  #include  #include  #include  #include  pthread_t main_id; void *thread_main(void* arg) { sleep(10); pthread_kill(main_id, SIGUSR1); } void signal_handler(int sig) { puts("got signal"); (void) sig; } int main(int argc, char** argv) { struct sigaction sa; sa.sa_handler = signal_handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); main_id = pthread_self(); pthread_t id; pthread_create(&id, NULL, thread_main, NULL); char *input = readline("prompt> "); puts("main thread done"); return 0; } 

输出:

 $ ./test prompt> got signal enter something main thread done $ 

谢谢。

Joachim Pileborg在评论中回答了这个问题。

最好的解决方案似乎是使用readline备用接口。 文档位于http://www.delorie.com/gnu/docs/readline/rlman_41.html

这也是http://www.mcld.co.uk/blog/blog.php?274的一个非常基本的例子, 它只需要适应使用select而不是使用sleep进行轮询。

比使用信号好多了!

更改signal_handler函数:

 void signal_handler(int sig) { puts("got signal"); //(void) sig; exit(sig); } 

libreadline读取字符的默认实现( int rl_getc(FILE *) )确实以简单的read()方式处理EINTR (如果发出信号,则由read()返回read() 。 由于这个接收信号不会取消readline()

要解决此问题,您可以将函数指针rl_getc_function设置为您自己的实现以读取字符(默认情况下, rl_getc_function指向rl_getc() )。