【发布时间】:2012-08-30 16:51:44
【问题描述】:
我正在尝试使用信号 (SIGUSR1) 中断 readline,但显然如果未处理信号,程序将退出,在处理时,它会继续 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
$
谢谢。
【问题讨论】:
-
注意: puts() 在信号处理程序中是不安全的(它可能调用 malloc,它是不可重入的)。
-
这纯粹是我为测试问题而创建的示例。所以不安全并不重要。
-
您可能需要使用alternate interface。您还应该阅读更多关于 readlines signal handling.
-
Joachim:使用替代界面效果很好。如果你想领取声望点,请回答我接受,否则我明天做一个。
标签: c pthreads signals readline