我试图用信号(SIGUSR1)中断readline,但显然如果没有处理信号,程序退出,处理时,readline继续进行,好像什么也没发生。读取线应该能够使用信号中断。
我从另一个问题得到了这个想法:force exit from readline() function
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <readline/readline.h>
#include <pthread.h>
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
$
感谢。
答案 0 :(得分:2)
Joachim Pileborg在评论中回答了这个问题。
最佳解决方案似乎是使用readline备用接口。文档位于http://www.delorie.com/gnu/docs/readline/rlman_41.html
同样是http://www.mcld.co.uk/blog/blog.php?274的一个非常基本的例子,它只需要适应使用select而不是使用sleep进行轮询。
比使用信号好多了!
答案 1 :(得分:1)
更改signal_handler
功能:
void signal_handler(int sig)
{
puts("got signal");
//(void) sig;
exit(sig);
}
答案 2 :(得分:1)
libreadline
读取字符(int rl_getc(FILE *)
)的默认实现会处理EINTR
(如果发出信号,则由read()
返回),只需重新{{{} 1}} ING。由于此接收信号不取消read()
。
要解决此问题,您可以将函数指针readline()
设置为您自己的实现以读取字符(默认情况下rl_getc_function
指向rl_getc_function
。)