2010-12-17 7 views
1

Der Fall ist: Ich registriere einen Signal-Handler mit Signalfunktion. Die Frage:Signalverarbeitung

  1. Ist-Handler immer unabhängig von dem Prozesszustand genannt? (Ich meine es wurde gestoppt, etc.). Was passiert dort? (Abhängig vom Status)

  2. Sind Handler Funktionen als einige "spezielle Funktionen" vom System registriert (dh wenn der Handler läuft, werden andere Signale nicht empfangen und werden so in den Stack oder in eine SMS gelegt. Oder vielleicht Sie werden einfach ignoriert.) Wenn nicht, stellen Sie sich vor, dass der Handler strats, wenn er ein anderes Signal bekommt, diesen Handler erneut aufruft, obwohl "der erste" seine Aufgabe noch nicht abgeschlossen hat und so weiter.

Antwort

4
  1. „Während ein Prozess beendet wird, zusätzliche Signale, die an den Prozess gesendet werden sollen nicht zugestellt werden, bis der Prozess fortgesetzt wird, außer SIGKILL (...) Die Standardaktion für SIGCONT ist Fortsetzen der Ausführung an dem Punkt, an dem der Prozess gestoppt wurde, nachdem alle anstehenden nicht blockierten Signale behandelt wurden. " (Unix standard, section Signal Concepts.)

  2. Normalerweise geschieht nichts besonderes. Wenn ein Signal X in einem Signal-Handler für Y abgefangen wird, wird die Ausführung einfach zu dem Handler für X übertragen, wonach der Handler für Y die Ausführung wieder aufnimmt.

Das folgende Programm demonstriert dieses Verhalten. raise(sig) sendet ein Signal an den aufrufenden Prozess (es ist wie kill(getpid(), sig)).

void hello(int unused) 
{ 
    printf("Hello, "); 
    raise(SIGUSR2); 
    printf("!\n"); 
} 

void world(int unused) 
{ 
    printf("world"); 
} 

int main() 
{ 
    signal(SIGUSR1, hello); 
    signal(SIGUSR2, world); 
    raise(SIGUSR1); 

    return 0; 
} 

Dies ist „sicher“, weil ein Prozesssignal akzeptiert nur von Prozessen mit der gleichen Benutzerkennung (oder root), so können Sie sich nur in dem Fuß auf diese Weise schießen.

+0

Und was ist, wenn X == Y? (Ie. Der gleiche Handler soll gestartet werden?) – DimG

+0

Selbe Sache. Versuchen Sie, ein Signal mit 'void handle (int sig) {raise (sig); } ' –

+0

Vielen Dank) – DimG

Verwandte Themen