c/c++语言开发共享用信号中断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备用接口。 文档位于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

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐