pthreads - Readline: обрабатывать прерывания без лишних строк - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь использовать библиотеку 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 о его реализации.

Любое руководство приветствуется.

...