2016-10-19 3 views
1

Ich habe 2 Prozess lässt sagen A und B. Prozess A wird die Eingabe vom Benutzer und einige Verarbeitung erhalten.So senden Sie eine Benachrichtigung an einen anderen Prozess von innen Signal-Handler?

Es gibt keine Eltern/Kind-Beziehung zwischen Prozess A und B.

Wenn Verfahren A durch ein Signal getötet, Gibt es eine Möglichkeit, die Nachricht B von innen Signal-Handler zu verarbeiten senden kann?

Hinweis: Für meine Anforderung ist es in Ordnung, dass, sobald ich fertig mit der Verarbeitung bereits Eingang vom Benutzer erhalten und aus der Hauptschleife verlassen, wenn SIGHUP-Signal empfangen wird.

Ich habe folgende Idee in meinem Kopf. Gibt es einen Fehler in diesem Design?

Prozess A

#include <stdio.h> 
    #include <signal.h> 

    int signal;// variable to set inside signal handler 

    sig_hup_handler_callback() 
    { 
     signal = TRUE; 
    } 


    int main() 
    { 
     char str[10]; 
     signal(SIGHUP,sig_hup_handler_callback); 
     //Loops which will get the input from the user. 
     while(1) 
     { 
     if(signal == TRUE) { //received a signal 
     send_message_to_B(); 
     return 0; 
     } 

     scanf("%s",str); 
     do_process(str); //do some processing with the input 
     } 

     return 0; 
    } 

    /*function to send the notification to process B*/ 
    void send_message_to_B() 
    { 
     //send the message using msg que 
    } 

Antwort

1

Man denke nur, wenn Prozess A do_process(str); Ausführung und Absturz passieren dann in Rückruf wird Flag aktualisiert werden, aber Sie while-Schleife wird nie für das nächste Mal so Ihre send_message_to_B(); wird nicht aufgerufen werden genannt. Also besser, diese Funktion nur im Callback zu setzen.

Wie unten.

1

Wie von Jeegar in der anderen Antwort erwähnt, werden fatale Signale die Hauptausführung des Prozesses unterbrechen und den Signal-Handler aufgerufen haben. Und die Kontrolle wird nicht dorthin zurückkehren, wo sie unterbrochen wurde. Daher wird Ihr Code, wie er jetzt angezeigt wird, niemals send_message_to_B nach der Behandlung des fatalen Signals aufrufen.

Seien Sie vorsichtig, welche Funktionen Sie von den Signalhandlern aufrufen. Einige Funktionen gelten als nicht sicher, wenn sie von Signalverarbeitern aufgerufen werden - Refer section - Async-signal-safe functions

Verwandte Themen