2017-01-27 11 views
0

Я пытаюсь изменить следующий код, чтобы использовать sigaction() для перехвата SIGINT;Как использовать sigaction() для перехвата SIGINT?

мне нужно заменить "для" петли с «в то время как (1), вы должны быть в состоянии выйти из программы, введя " (. Нужно перехватить SIGQUIT)^\"

#include <signal.h> 
#include <unistd.h> 
#include <iostream> 

using namespace std; 

void func (int sig) 
{ 
    cout << "Oops! -- I got a signal " << sig << endl; 
} 

int main() 
{ 
    (void) signal (SIGINT, func); //catch terminal interrupts 

    //for (int i = 0; i < 20; ++i) 
    while(1) 
    { 
     cout << "signals" << endl; 
     sleep (1); 
    } 
    return 0; 
} 
+1

SIGINT или SIGQUIT? Который из них? –

+0

Вам нужно настроить переменную 'struct sigaction' с правильной информацией. Затем вы вызываете 'sigaction()' вместо 'signal()'. Большая часть остального остается неизменной. Обратите внимание, что вызов 'cout << ...' в обработчике сигналов, скорее всего, будет «неопределенным поведением». См. [Как избежать использования 'printf()' в обработчике сигналов] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-a-signal-handler/). Это строго для C, но аналогичные понятия применимы и к C++. –

ответ

0

You можно использовать sigaction поймать SIGINT (и до сих пор выход вы описали) со следующим кодом (который компилируется и работает для меня с помощью лязг на Unix подобных ОС):

#include <signal.h> 
#include <iostream> 
#include <unistd.h> 

static int sigcaught = 0; 

static void sighandler(int signum) 
{ 
    sigcaught = signum; 
} 

int main() 
{ 
    int signum = SIGINT; 

    struct sigaction newact; 
    struct sigaction oldact; 
    newact.sa_handler = sighandler; 
    sigemptyset(&newact.sa_mask); 
    newact.sa_flags = 0; 

    sigaction(signum, &newact, &oldact); 

    while (!sigcaught) 
    { 
     std::cout << "waiting for signal" << std::endl; 
     sleep(1); 
    } 
    std::cout << "Oops! -- I got a signal " << sigcaught << std::endl; 
    return 0; 
} 

Обратите внимание, что: этот код намеренно не проверяет возвращаемые значения (например, от sigaction, а не sleep), так как исходный код отсутствует, и поскольку проверка их может отвлечь читателя от просмотра соответствующих различий. Я бы не хотел, чтобы производственный код игнорировал возвращаемые значения (особенно те, которые могут указывать на ошибки).

 Смежные вопросы

  • Нет связанных вопросов^_^