中断c/c++;带信号的读线

中断c/c++;带信号的读线,c,pthreads,signals,readline,C,Pthreads,Signals,Readline,我试图用信号(SIGUSR1)中断readline,但是很明显,如果信号没有被处理,程序就会退出,在处理时,readline会继续运行,就像什么都没有发生一样。readline应该能够使用信号中断 我从另一个问题得到了这个想法: 谢谢。更改您的信号处理器功能: void signal_handler(int sig) { puts("got signal"); //(void) sig; exit(sig); } libreadline读取字符的

我试图用信号(SIGUSR1)中断readline,但是很明显,如果信号没有被处理,程序就会退出,在处理时,readline会继续运行,就像什么都没有发生一样。readline应该能够使用信号中断

我从另一个问题得到了这个想法:


谢谢。

更改您的
信号处理器
功能:

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

libreadline
读取字符的默认实现(
int rl_getc(FILE*)
)只需重新读取
read()
即可处理
EINTR
(如果有信号,则由
read()
返回)。因此,接收信号不会取消读取线()


为了解决这个问题,您可以将函数指针
rl_getc_函数
设置为您自己的实现,以读取字符(
rl_getc_函数
默认指向
rl_getc()
)。

最好的解决方案似乎是使用readline备用接口。文件在

这也是一个非常基本的例子,只需要调整为使用select而不是sleep轮询


比使用信号要好得多

注意:puts()在信号处理程序中是不安全的(它可能调用malloc,而malloc是不可重入的)。因此,不安全并不重要。你可能需要使用。您还应该阅读更多关于readlines的内容。Joachim:使用替代界面非常有效。如果你想申请名誉积分,请回答我接受,否则我明天会回答。我不想不干净地直接离开议会。代码示例纯粹是为了测试问题。我打算在一个更大的程序中中断readline,该程序需要大量的清理,而不仅仅是exit()。我在我发布的示例代码中对此进行了测试,它工作得非常好,不幸的是,我在我的其他代码中尝试了同样的方法,但没有成功。我猜这是因为另一段代码使用了一个空闲钩子,所以它不是阻塞rl_getc_函数,而是阻塞select,accept不会中断。我想我必须尝试Joachim提到的替代接口。
select()
以及
accept()
应在收到信号时返回,并将
errno
设置为
EINTR
两者。因此,您可以考虑将信号发送到代码< >选择()/<代码>(或<代码>接受()>代码>我不知道它实际上在做什么)。TroyHeron此解决方案似乎是最干净的,但是我想知道如何确定是否按下了ctrl-d、ctrl-c等键?
$ ./test
prompt> got signal
enter something
main thread done
$
void signal_handler(int sig)
{
        puts("got signal");
        //(void) sig;
        exit(sig);
}