Comment obtenir plus d’informations sur le signal SIGFPE?

Ceci provient du manuel de référence de la bibliothèque GNU C

int SIGFPE

Le signal SIGFPE signale une erreur arithmétique fatale. Ce signal couvre en fait toutes les erreurs arithmétiques, y compris la division par zéro et le dépassement de capacité.

Les systèmes BSD fournissent au gestionnaire SIGFPE un argument supplémentaire qui distingue les différentes causes de l’exception. Pour accéder à cet argument, vous devez définir le gestionnaire pour qu’il accepte deux arguments, ce qui signifie que vous devez le convertir en un type de fonction à un argument afin d’établir le gestionnaire.

Mais il n’y a pas d’exemple sur la façon d’ accéder à l’argument supplémentaire .

J’ai fait mon travail sur Google mais je n’ai rien trouvé.

Comment puis-je obtenir ces informations supplémentaires?

Comme EOF l’a mentionné dans les commentaires, la meilleure façon de le faire, qui ne nécessite pas de sigaction , et un bonus correctement documenté, consiste à installer votre gestionnaire de signaux à l’aide de sigaction et de l’indicateur SA_SIGINFO , puis dans le champ si_code . du second paramètre (type siginfo_t ), vous pouvez déterminer quelle erreur en virgule flottante s’est produite:

Les valeurs suivantes peuvent être placées dans si_code pour un signal SIGFPE :

FPE_INTDIV Entier divise par zéro.

FPE_INTOVF entier.

FPE_FLTDIV flottantes par zéro.

FPE_FLTOVF flottante.

FPE_FLTUND flottante.

FPE_FLTRES Résultat inexact à FPE_FLTRES flottante.

FPE_FLTINV Opération invalide à FPE_FLTINV flottante.

FPE_FLTSUB hors limites.

Source: Page de manuel de Linux sigaction (2)

La même liste est également facilement disponible sur la page de manuel siginfo de FreeBSD .

Les informations auxquelles glibc fait référence sont un mécanisme historique et ne sont pas portables. Sur FreeBSD, la page de manuel de sigvec (2) inclut une notation indiquant qu’elle est uniquement prise en charge sur l’architecture VAX-11:

Sur le VAX-11 La routine du gestionnaire peut être déclarée:

 void handler(sig, code, scp) int sig, code; struct sigcontext *scp; 

Ici, sig est le numéro du signal dans lequel les défauts matériels et les traps sont mappés comme défini ci-dessous. L’argument code est soit une constante comme indiqué ci-dessous, soit, pour les défauts de mode de compatibilité, le code fourni par le matériel (les défauts du mode Compatibilité se distinguent des autres traps SIGILL en ayant PSL_CM défini dans le psl). L’argument scp est un pointeur sur la structure sigcontext (définie dans ), utilisée pour restaurer le contexte avant le signal.

La liste de mappage n’est pas réellement fournie dans cette version de la page de manuel. On peut le trouver dans la page de manuel du signal 4.3BSD-Reno (3) . Il est à noter que ce texte a 25 ans.

Sur les systèmes modernes, vous devez utiliser le mécanisme de sigaction, qui est beaucoup plus bien défini et portable.

BOGUES – Cette page de manuel est encore confuse.

En effet, ça l’est.