2016-03-24 8 views
0

Ich muss ein Programm schreiben, um die Bash-Shell zu emulieren. Die relevanten Teile des Programms sind hier. Das Programm endet beim Empfang von EOF (nicht gezeigt). Eine der verschiedenen Funktionen, die implementiert werden müssen, besteht nicht darin, das Programm zu beenden, wenn STRG-C gedrückt wird. Das Programm sollte nur eine neue Eingabeaufforderung erneut drucken, wenn SIGINT empfangen wird. Ich habe eine Handler-Funktion, die eine globale Variable ändert, um die aktuelle Schleifeniteration zu beenden, und eine äußere Schleife, die sie dann wieder ändert, um die innere Schleife wieder zu betreten. Das Programm beendet jedoch immer noch, wenn ich CTRL-C drücke. Warum ist das?Signal-Handling-Funktion + Ignorieren SIGINT

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<unistd.h> 
#include<time.h> 
#include<signal.h> 
#include<sys/wait.h> 

void SIGINT_handler(int signum); 

static volatile sig_atomic_t endflag = 0; 

int main(int argc, char **argv){ 

    while(1){ 
     endflag = 0; 

     while(!endflag){ 

        struct sigaction action; 

        action.sa_handler = &SIGINT_handler; 
        action.sa_flags = 0; 

        if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){ 
          perror("Failed to set SIGINT handler"); 
          exit(EXIT_FAILURE); 
       } 
     } 
    } 

    return 0; 
} 

void SIGINT_handler(int signo){ 

    if(signo == SIGINT){ 
     endflag = 1; 
    } 
    fflush(stdout); 

} 
+0

Der Code mehr oder weniger OK aussieht. Erhalten Sie Warnungen während der Kompilierung? Welches Betriebssystem, welchen Compiler benutzen Sie? – alk

+0

Es ist keine gute Idee, 'stdout' aus einem Signal-Handle zu entfernen. Ich bezweifle auch, dass die globale Flagge "flüchtig" definiert werden muss. – alk

+0

Sie müssen Betriebssystem und Compiler veröffentlichen, dies funktioniert auf einem Mac mit gcc und clang. – Harry

Antwort

-1

Sie haben die Signal-Handler-Funktion in Hauptfunktion registrieren

setzen

(void) Signal (SIGINT, SIGINT_handler);

direkt nach dem Hauptfunktion eingeben

Try This

int main(int argc, char **argv){ 

    (void) signal(SIGINT,SIGINT_handler); 

while(1){ 
    endflag = 0; 

    while(!endflag){ 

       struct sigaction action; 

       action.sa_handler = &SIGINT_handler; 
       action.sa_flags = 0; 

       if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){ 
         perror("Failed to set SIGINT handler"); 
         exit(EXIT_FAILURE); 
      } 
    } 
} 

return 0; 

}

+0

Der Aufruf von 'sigaction()' registriert auch einen Signal-Handler. – alk

Verwandte Themen