2010-10-24 3 views
8

Was ist der beste Weg in C unter Linux für die Einrichtung eines Programms, das mehrere POSIX-Signale mit derselben Funktion verarbeiten kann?Was ist der richtige Weg, um eine einzelne Signal Handler-Funktion für mehrere Signale zu haben?

Zum Beispiel in meinem Code habe ich eine Handler-Funktion, die ich allgemein Aufruf will, wann immer ein Signal aufgefangen wird einige Aktionen ausführen:

/* Exit handler function called by sigaction */ 
void exitHandler(int sig, siginfo_t *siginfo, void *ignore) 
{ 
    printf("*** Got %d signal from %d\n", siginfo->si_signo, siginfo->si_pid); 
    loopCounter=0; 

    return; 
} 

Ich habe zwei Signale aufgebaut, indem einzelne sigaction zu fangen ruft für jedes Signal auf:

/* Set exit handler function for SIGUSR1 , SIGINT (ctrl+c) */ 
struct sigaction act; 
act.sa_flags = SA_SIGINFO; 
act.sa_sigaction = exitHandler; 
sigaction(SIGUSR1, &act, 0); 
sigaction(SIGINT, &act, 0); 

Ist dies der richtige Weg, um diese Art der Handhabung einzurichten? Gibt es einen anderen Weg, wo ich nicht alle möglichen Signalnummern aufzählen muss?

Antwort

3

Ich kann nicht sehen, wie Sie einfach einen einzigen Handler für alle Signale einstellen können. Sie können jedoch ziemlich schließen, indem Sie sigfillset() verwenden, um einen Satz zu generieren, der alle gültigen Signalnummern enthält, und dann über mögliche Signalnummern iterieren, indem sigismember() bestimmt, ob diese Nummer in der Menge ist, und einen Handler festlegen. OK, ich kann keine Methode zur Bestimmung der maximal möglichen Signalnummer sehen, daher müssen Sie möglicherweise einen geeigneten Maximalwert erraten.

+0

Danke, das ist eine gute Idee. Ich schätze, ich kann weiterhin die Signale aufzählen, die ich gerne fangen würde, da ich neu in C bin. Ich war neugierig, ob ich etwas verpasst habe. – ammianus

3

"signum" -Parameter von "Sigaction" Systemaufruf ist ein ganzzahliger Wert, der nicht als Flag funktioniert.

Soweit ich weiß, gibt es keine Möglichkeit, eine Handler-Funktion für mehrere Signale in einem Aufruf zuzuweisen.

+0

Vielen Dank für die klare Antwort. – ammianus

Verwandte Themen