Ich bin Neuling auf den Linux-Signalen, bitte helfen Sie. Der folgende Code erhält einen Core Dump, wenn er in Linux 2.6 gcc ausgeführt wird.
$ ./a.out
Gleitkommaausnahme (Core Dumped)
Die Fragen:
1. Da eine Prozesssignalmaske installiert ist, sollte das durch die Zeile 40 (z = x / y) erzeugte "SIGFPGE" nicht blockiert werden?
2. Wenn es nicht blockiert ist, sollte, da ein Signal-Handler installiert wurde, nicht der "SIGFPE" durch den Signal-Handler statt eines Kern-Dumps erfasst werden?
3. Wenn ich Zeile 40 (z = x / y) auskommentiert und stattdessen Zeile 42 (raise (SIGFPE)) verwende, dann funktioniert alles wie erwartet. Was ist der Unterschied zwischen x / 0 und SIGFPE hier erhöhen?
Hier ist der Code:
%Vor%Jeder SIGFPE, der durch eine Hardware-Trap verursacht wird, während das Signal blockiert ist, verursacht undefiniertes Verhalten:
Wenn eines der SIGFPE-, SIGILL-, SIGSEGV- oder SIGBUS-Signale erzeugt wird, während sie blockiert sind, ist das Ergebnis undefiniert, es sei denn, das Signal wurde durch die Funktion kill (), die Funktion sigqueue () oder die Erhöhung erzeugt ( ) Funktion.
(aus sigprocmask
specification )