Le message "Erreur de segmentation" est-il sous STDERR?

17

J'ai exécuté un exécutable dans bash

./code > log

Il affiche des messages d'erreur occasionnels sur le terminal tandis que toutes les instructions printf vont dans le fichier journal. Je le relance comme ci-dessous

./code >& log

Maintenant, les messages d'erreur occasionnels vont également dans le journal. Mais s'il y a un défaut de segmentation, il est toujours affiché sur le terminal. Pourquoi? Comment faire entrer le message Segmentation fault (core dumped)dans le fichier journal?


utilisateur $ bash --version

GNU bash, version 4.2.24 (1) -release (i686-pc-linux-gnu)

user13107
la source

Réponses:

14

Un défaut de segmentation est un signal, si vous ne l'attrapez pas, votre programme sera terminé et votre shell l'imprimera sur son stderr (plutôt que sur le stderr de votre programme).

Il est possible que votre programme ou le shell entreprenne des actions spécifiques lorsque cela se produit, soit par le programme captant le signal, soit par votre shell captant le signal SIGCHILD puis vérifiant l'état de sortie de votre enfant.

cjh
la source
1
@ user13107help trap
Carlos Campderrós
2
Ouaip. je l'ai. si quelqu'un est intéressé, voici ce que j'ai fait pastebin.com/QyeJYYHC
user13107
1
La trapcommande shell intercepte les signaux envoyés au shell . Il ne fonctionnera donc pas pour attraper celui qui est envoyé à votre programme.
derobert
1
@ warl0ck, il est possible d'attraper une erreur de segmentation de la même manière que vous interceptez n'importe quel signal, mais cela peut conduire à un comportement indéfini, mais si vous savez ce que vous faites, vous pouvez au moins mourir de manière raisonnable. L'OP voulait imprimer sur stderr, dans ce cas, attraper le défaut de segmentation et l'impression est sûre.
cjh
1
@ warl0ck: vous le pouvez, c'est juste une très mauvaise idée de faire quoi que ce soit dans le gestionnaire, mais vous connecter et quitter. Il existe cependant des cas d'utilisation spécialisés.
Linuxios
19

Le message "défaut de segmentation" est imprimé sur stderr, mais c'est l'erreur standard du shell, pas l'erreur standard du programme. Le shell imprime ce message lorsqu'il détecte que le programme s'est terminé à cause d'un signal.

Vous pouvez désactiver le message en redirigeant stderr autour de la partie du script shell qui exécute le programme:

{ ./code; } >&log
Gilles 'SO- arrête d'être méchant'
la source