2016-05-29 8 views
-1

Ich habe ein einfaches Programm, um die Signalverarbeitung in C für Linux zu demonstrieren. Ich kann es nur kompliziert für das Experimentieren ..Linux: Ignorieren eines Signals in einem Signal-Handler, ignorieren alle solche aufeinanderfolgenden Signale

void sigquit(int signo) 
{ 
    printf("Recieved signo : %d\n",signo); 
    signal(SIGQUIT,SIG_IGN); 
} 

int main() 
{ 

    /* register the signal handler */ 
    if(signal(SIGQUIT,sigquit) == SIG_ERR) 
    { 
     perror("Error handling SIGQUIT signal"); 
     exit(1); 
    } 
    for(;;); 
    return 0; 
} 

ich die Ausgabe bin immer:

^\Recieved signo : 3 
^\^\^\^\^\^\^\ 

während ich dies erwartet hatte: Es wurde

^\Recieved signo : 3 
    ^\Recieved signo : 3 
    ^\Recieved signo : 3 
    ^\Recieved signo : 3 

Warum nur erste Mal meine Handler aufgerufen und nicht weiter. Ich erwartete, dass die Signale zuerst zum Hauptthread kommen und dann an die Handler übergeben werden.

+0

Also was ist die Idee hinter dieser Linie 'Signal (SIGQUIT, SIG_IGN)' 'obwohl? ;-) – alk

Antwort

3

Signal (SIGQUIT, SIG_IGN);

Von Ihrem Signal-Handler haben Sie Ihr Programm angewiesen, alle weiteren Fälle des Signals zu ignorieren. Wenn Sie das Signal erneut senden, wird es ignoriert, genau wie Sie es ihm gesagt haben.

+0

Die Verwirrung liegt wohl an meinem Verständnis. Bis jetzt bin ich der Ansicht, dass, wenn das Programm mit 'main()' beginnt, es sieht, dass ich 'sigint()' als den Handler registrieren möchte. Also, es (nicht sicher, ob Compiler oder zur Laufzeit) registrieren "sigint", um jedes Mal aufgerufen werden, wenn das Signal kommt. Was innerhalb von "sigint()" ist, ist irrelevant. Dies könnte http://unix.stackexchange.com/questions/80044/how-signals-work-internally helfen. Ich erforsche es mehr, um die Arbeit zu klären. –

+0

"* Was ist innerhalb von sigint() ist irrelevant. *" Warum? : -S @InsaneCoder Versuchen Sie, 'int i = 0; i/= i; 'innerhalb des Handlers. :-) – alk

+0

@InsaneCoder Du machst es klingt wie der Compiler ist Hellseher. Das ist nicht der Fall. Ihr Programm wird jeweils einzeln ausgeführt. Sobald ein Signal-Handler registriert wurde und bis ein weiterer Befehl gegeben wird, wird jedes Mal, wenn ein Signal empfangen wird, der Handler aufgerufen und ein Befehl auf einmal ausgeführt. Sie haben Code in Ihrem Handler platziert, um das zu stoppen, und das System hat tatsächlich angehalten. –