Signale und Threads



  • Hallo,

    ich möchte einen Thread so lange anhalten, bis ein Signal (z.B. SIGUSR1) empfangen wird.

    Dazu habe ich folgenden Ansatz:

    int main( int argc, char *argv[] ) {
    	pthread_t thread1;
    	int  iret1;
    
    	iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) "Thread1");
    
    	while(1) {
    		printf("Main\n");
    		sleep(1);
    	}
    }
    

    Und print_message_function sieht so aus:

    void *print_message_function( void *ptr ) {
    	char *message;
    	int b;
    	message = (char *) ptr;
    	// Einrichten Signal-Handler
    	struct sigaction sigact;
        sigset_t block_set;
        sigfillset( &block_set );
    
    	// Handler für SIGUSR1 definieren
    
    	sigemptyset( &sigact.sa_mask );
        sigact.sa_flags = SA_RESTART;
        sigact.sa_handler = catcher;
        sigaction( SIGUSR1, &sigact, NULL );
    
           // endlose while()-Schleife
    
    	while(1) {
    		printf("Hier ist Thread1\n");
    
                    // Warten, bis ein Signal kommt...
    		sigwait(&block_set, &b);
    
                    // .. und dann weitermachen => ABER DAS KLAPPT NICHT!
    		printf("blupp\n"); fflush(stdout);
    	}
    }
    

    Die Signalverarbeitung funktioniert, der Signal-Handler (die Funktion "catcher") wird ausgeführt. Allerdings wird die Zeile nach sigwait (also printf("blupp\n");) nicht ausgeführt, nachdem ein Signal empfangen wird. Es scheint so, als ob dann nach dem Empfangen eines Signals im Thread nicht nach sigwait weiter gemacht werden würde.

    Wenn ich das ganze ohne Threads mache, dann funktioniert es (z.B. direkt in der main()-Funktion).

    Verstehe ich etwas falsch? Woran liegt das?

    Wie schaffe ich es, dass der Thread, nachdem SIGUSR1 kam, direkt nach sigwait weitermacht?

    Vielen Dank,

    brahm



  • Schau dir mal den Notes-Abschnitt auf der Manpage an.



  • MFK schrieb:

    Schau dir mal den Notes-Abschnitt auf der Manpage an.

    Vielen Dank für deine Antwort.

    Welche Manpage meinst du?

    Weder in pthread_create(3) noch in sigwait(3) befindet sich bei mir ein Notes-Abschnitt.





  • vielen herzlichen Dank!


Anmelden zum Antworten