2017-01-27 3 views
0

Ich versuche, den folgenden Code zu ändern, um mit sigaction() SIGINT abzufangen;Wie kann ich mit sigaction() SIGINT abfangen?

Ich brauche die „für“ Schleife ersetzen mit „while (1), sollten Sie durch Eingabe das Programm beenden können,‚ (. Sie benötigen SIGQUIT abzufangen)^\‘

#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 oder SIGQUIT? Welches ist es? –

+0

Sie müssen die Variable 'struct sigaction' mit den korrekten Informationen einrichten. Sie rufen dann 'sigaction()' anstelle von 'signal()' auf. Der größte Teil bleibt unverändert. Beachten Sie, dass das Aufrufen von 'cout << ...' in einem Signal-Handler sehr wahrscheinlich ein 'undefiniertes Verhalten' ist. Siehe [Vermeidung von 'printf()' in einem Signalhandler] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-a-signal-handler/). Es ist ausschließlich für C, aber ähnliche Konzepte gelten auch für C++. –

Antwort

0

Sie kann sigaction verwenden SIGINT (und immer noch die Ausgabe haben Sie beschrieben haben) mit dem folgenden Code zu fangen (die für mich mit Klappern auf einem Unix-artigen Betriebssystemen und arbeitet kompiliert):

#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; 
} 

Bitte beachten, dass: diesen Code überprüft absichtlich keine Rückgabewerte (wie von sigaction noch sleep), da der ursprüngliche Code dies nicht ist, und da das Überprüfen dieser Zeichen den Leser möglicherweise davon abhält, die relevanten Unterschiede zu sehen. Ich möchte jedoch nicht, dass Produktionscode Rückgabewerte ignoriert (insbesondere solche, die Fehler anzeigen können).

Verwandte Themen