我试图用信号(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备用接口。 文档位于https://www.delorie.com/gnu/docs/readline/rlman_41.html
这也是https://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()
)。
以上就是c/c++开发分享用信号中断c / c ++ readline相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559965.html