2016-04-01 19 views
0

Ich habe eine harte Zeit mit einem kleinen Stück Code mit:raise() in while-Schleife

act_therm.sa_handler=handler_therm; 
    sigaction(SIGUSR1,&act_thermom,NULL); 
    while(1){ 
     raise(SIGUSR1); 
     sleep(1); 
     } 

Der Code kompiliert perfekt, aber die Funktion handler_term wird nur einmal gestartet. Es scheint, dass das Verhalten des Signals auf den Standardwert zurückgesetzt wird, nachdem es zum ersten Mal ausgelöst wurde.

+3

Ich habe das Gefühl, dass sobald der Signal-Handler aufgerufen wird, die Standard-Aktion wiederhergestellt wird, wenn Sie nicht mit den anderen Teilen der 'act_therm'-Struktur herumspielen. Vielleicht habe ich die Handbuchseite [sigaction] (http://man7.org/linux/man-pages/man2/sigaction.2.html) –

+0

gelesen und versucht, sigaction hinzuzufügen (SIGUSR1, & temp, NULL); in der While-Schleife und es ist Arbeit. Wie wenn sigaction nur einmal funktioniert ... –

+2

Das Problem kann auch im Handler selbst auftreten, siehe [Minimal Complete Verifizierbares Beispiel] (http://stackoverflow.com/help/mcve). – user3386109

Antwort

0

fand ich endlich die vollständige Antwort in einem Buch:

durch die Struktur einfach so erklärt:

struct sigaction act_therm; 
act_therm.sa_handler=handler_therm; 

Die Flagge SA_RESETHAND ist (standardmäßig) auf die Struktur angebracht. Jedes Mal, wenn sigaction damit aufgerufen wird, stellt es das Standardverhalten des Signals wieder her.

Es gibt zwei Wege, dieses Problem zu lösen:

  • Argen, die das Verhalten des Signals jedes Mal neu zu definieren besteht das Signal mit einem sigaction
  • definiert die komplette Struktur genannt wird (von der Mann) und die Schaffung von sa_flags so dass SA_RESETHAND nicht genannt wird:
struct sigaction { 
    void  (*sa_handler) (int); 
    void  (*sa_sigaction) (int, siginfo_t *, void *); 
    sigset_t sa_mask; 
    int  sa_flags; 
    void  (*sa_restorer) (void); 
};