2017-05-20 6 views
0

Ich schreibe ein Programm in C mit ncurses.Ich versuche, das CRTL C-Signal zu behandeln. In meinem Code wird dieses Signal abgefangen und bearbeitet, aber das Programm ist nicht korrekt beendet. Könnte es sein, dass ich aus Ncurses austrete?Handle Signale in Ncurses

//handle SIGINT signal 
void handle_signal(int signal){ 

    if(signal == SIGINT){ 

     clear(); 
     mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED"); 
     refresh(); 
     sleep(1/2); 
     exit(0); 

    } //close if statement 

}//close handle_signal() function 
+0

'Schlaf (1/2)'? Das sind zwei ganze Zahlen, also wird das Ergebnis dieser Division auch eine ganze Zahl sein. Das ist das gleiche wie das Aufrufen von 'sleep (0)'. Ist es das was du wolltest? – SiggiSv

+0

Ich tat das nur zum Testen, um die Nachricht gedruckt zu sehen .. Es löst nichts :( – CXB

Antwort

1

Ohne weitere Forschung: Ich wäre sehr überrascht, wenn curses Funktionen waren das Signal tatsächlich sicher. Im Allgemeinen ist es am besten, wenn Sie Ihre Signalhandler minimal halten, idealerweise nur eine Flagge setzen. Also, sollten Sie Ihr Problem wie folgt lösen:

static volatile sig_atomic_t interrupted = 0; 

im Signal-Handler:

if (signal == SIGINT) 
    { 
     interrupted = 1; 
    } 

irgendwo in der Hauptschleife:

if (interrupted) 
    { 
     clear(); 
     mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED"); 
     refresh(); 
     sleep(1); 
     endwin(); 
     exit(0); 
    } 

Hinweis Code nicht nennen endwin() überall ist dies erforderlich, um das Terminal wieder normal zu machen.

1

Wie im initscr manual page erwähnt, installiert ncurses einen Handler für SIGINT

der HF zu cleanup beim Beenden den Bildschirm versucht. Obwohl es in der Regel wie erwartet funktioniert, gibt es Einschränkungen:

Wenn Sie Setup-Handler vor initscr (oder newterm), wird es nicht aufgerufen werden. Wenn Sie den Handler danach einrichten, müssen Sie die verschiedenen Einschränkungen der Funktionen berücksichtigen, die Sie sicher in einem Signalhandler aufrufen können.

ncurses Handhabung von SIGINT berücksichtigt die Tatsache, dass einige der Funktionen, die es normalerweise verwenden würde, nicht sicher sind, und es verwendet eine andere Strategie, wenn es ein Signal empfangen hat (das ist vielleicht nicht 100% zuverlässig, aber ein Verbesserung).

Ihr Signalhandler berücksichtigt dies nicht, und z. B. könnte ncurses malloc aufrufen, um zusätzliche Ausgabepuffer zu verarbeiten, und "nicht funktionieren", da malloc keine sichere Funktion ist.

Weiterführende Literatur: