Я пытаюсь использовать библиотеку readline в потоке для обработки пользовательского ввода. Однако я хочу иметь возможность перехватывать SIGINT и выполнять некоторые действия в зависимости от состояния, представленного другими переменными.
Моя текущая цель - иметь возможность перехватить сигнал и напечатать сообщение, и позволить readline подскажите продолжить. Следующий код является чрезвычайно упрощенной версией моего проекта, где readline и обработчики сигналов работают как положено, где я не использую pthreads:
#include <iostream>
#include <string>
#include <readline/readline.h> // The readline library
#include <readline/history.h>
#include <signal.h>
void signal_callback_handler(int signum) {
std::cout << "\nInterrupted" << std::endl;
rl_on_new_line(); // Regenerate the prompt on a newline
rl_replace_line("", 0); // Clear the previous text
rl_redisplay();
}
void* read_func(void* args){
struct sigaction sigIntHandler; // The struct to control signals
sigIntHandler.sa_handler = &signal_callback_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
signal(SIGINT, signal_callback_handler); // Register the handler in case of SIGINT
char* buf; // Buffer for readline
while (1){
const char* p = "Prompt: ";
buf = readline(p);
std::string cmd = buf;
free(buf);
std::cout << cmd << std::endl;
if (cmd == "quit"){
return NULL;
}
}
}
int main(int argc, char** argv){
read_func(NULL);
}
В этом случае он работает следующим образом, что я и использую ищу достижения:
Prompt: test
test
Prompt: ^C
Interrupted
Prompt: test
test
Prompt: quit
quit
$
Однако, если я изменю функцию main
следующим образом:
int main(int argc, char** argv){
pthread_t thread;
pthread_create(&thread, NULL, read_func, NULL);
pthread_join(thread, NULL);
}
, тогда обработчик прерываний не будет вызван, пока я не нажму другую клавишу , Например:
Prompt: test
test
Prompt: ^Ct
Interrupted
Prompt: test
test
Prompt: quit
quit
$
, где ^ C не печаталось до тех пор, пока я не набрал "t", в то же время вызывался и обработчик прерывания.
Есть ли в любом случае, чтобы обработчик прерываний вызывался сразу после отправки сигнала SIGINT, в отличие от ожидания другого нажатия клавиши? Я видел этот ответ , но я не совсем уверен, исправит ли это это, и если да, то как бы я go о его реализации.
Любое руководство приветствуется.