2016-03-26 10 views
0

Ich versuche SIGINT (CTRL + C) zu fangen. Ich möchte, dass, wenn Benutzer STRG + C eingeben, Kindprozess zu beenden, aber der Vater-Prozess normal fortgesetzt wird. Wenn ich Kindprozess in meinem Programm habe, funktioniert es ok, aber wenn ich nicht Kindprozess habe, bekomme ich "segmentation fault".segmentation störung signal handler sigint

Ich habe dies getan:

void sig_handler(int signo); 
//======================================== 
int main() 
{ 
    // CTRL + C => SIGINT handler 
    struct sigaction act; 
    act.sa_handler = sig_handler; 
    sigfillset(&act.sa_mask); 
    act.sa_flags = 0; 

    // Catch the signal 
    sigaction(SIGINT, &act, NULL); 
... 
// done some checks and then fork a child. 
} 

// SIGINT handler 
void sig_handler(int signo) 
{ 
// dont know what to write here 
} 
+0

bevor Sie Ihren Kindprozess abzweigen Holen Sie sich die aktuelle Prozess-ID, dann fork es Ihr Kind und erhalten Sie seine Prozess-ID auch dann bei der Handhabung des Signals überprüfen, ob ctrl c ist für die Elternprozess-ID oder nicht dann implementieren Sie Ihre Logik entsprechend. – FZE

+0

Auf welcher Codezeile erhalten Sie den Segmentierungsfehler? –

Antwort

0

Ich glaube, dass gerade durch die sigset() verwenden Sie Ihr Ziel erreichen können.

Ich würde einige Informationen aus der Manpage von Sigset zitieren.

Die Funktion sigset() modifiziert Signalverteilungen. Das Sig-Argument gibt das Signal an, das ein beliebiges Signal außer SIGKILL und SIGSTOP sein kann. Das Disp-Argument gibt die Disposition des Signals an, die SIG_DFL, SIG_IGN oder die Adresse eines Signal-Handlers sein kann. Wenn sigset() verwendet wird und disp die Adresse eines Signalhandlers ist, fügt das System sig zu die Signalmaske des aufrufenden Prozesses hinzu, bevor das Signal handler ausgeführt wird; Wenn der Signalhandler zurückkehrt, stellt das System das Signal der Maske des aufrufenden Prozesses in seinen Zustand vor der Lieferung des Signals zurück. Wenn sigset() verwendet wird und disp gleich SIG_HOLD ist, wird zusätzlich sig zur Signalmaske des aufrufenden Prozesses hinzugefügt und die Anordnung von sig bleibt unverändert. Wenn sigset() verwendet wird und disp nicht gleich SIG_HOLD ist, wird sig aus der Signalmaske des aufrufenden Prozesses entfernt.

Siehe diesen Link: sighold, sigignore, sigpause, sigrelse, sigset — legacy interface for signal management

Sie können eine Handler-Funktion einzurichten, die aufgerufen wird, wenn Sie SIGINT erhalten.

Ich hoffe, es hilft Ihnen, wenn Sie weitere Hilfe benötigen, erwähnen Sie es einfach in den Kommentaren.

+0

Bitte upvote, wenn die Antwort Ihr Problem löst. --Vielen Dank – shahharshil46