中断的C / C ++与信号的readline(Interrupting c/c++ readlin

2019-09-22 04:27发布

我试图中断与信号(SIGUSR1)readline的,但很明显,如果信号没有被处理,程序退出,操作时,它的ReadLine收益,仿佛什么都没有发生。 是的readline应该能够使用的信号被中断。

我从这个问题其他的想法: 从readline的力exit()函数

#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
$

谢谢。

Answer 1:

约阿希姆Pileborg在评论回答了这个问题。

最好的解决办法似乎是使用readline的备用接口。 该文档是在http://www.delorie.com/gnu/docs/readline/rlman_41.html

此外,在一个非常简单的例子http://www.mcld.co.uk/blog/blog.php?274 ,只是需要适应使用选择,而不是与睡眠投票。

比使用信号更好!



Answer 2:

更改signal_handler功能:

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


Answer 3:

libreadline的读取字符(默认实现int rl_getc(FILE *)并处理EINTR (由返回read()如果信号)的简单重新的方式read() ING。 由于该接收信号取消readline()

若要这一点,你可能周围的函数指针设置rl_getc_function自己的实现(读取一个字符rl_getc_functionrl_getc()默认情况下)。



文章来源: Interrupting c/c++ readline with signals