Kommt die Meldung "Segmentierungsfehler" unter STDERR?

17

Ich habe eine ausführbare Datei ausgeführt bash

./code > log

Es werden gelegentlich Fehlermeldungen auf dem Terminal angezeigt, während alle printf-Anweisungen in die Protokolldatei geschrieben werden. Ich wiederhole es wie unten

./code >& log

Jetzt werden auch gelegentliche Fehlermeldungen protokolliert. Liegt jedoch ein Segmentierungsfehler vor, wird dieser weiterhin am Terminal angezeigt. Warum? Wie wird die Nachricht Segmentation fault (core dumped)in die Protokolldatei geschrieben?


Benutzer $ bash --version

GNU Bash, Version 4.2.24 (1) -Release (i686-pc-linux-gnu)

user13107
quelle

Antworten:

14

Ein Segmentierungsfehler ist ein Signal. Wenn Sie dies nicht abfangen, wird Ihr Programm beendet und Ihre Shell druckt dies auf ihren stderr (und nicht auf den stderr Ihres Programms).

In diesem Fall kann entweder Ihr Programm oder die Shell bestimmte Aktionen ausführen, indem das Programm das Signal abfängt oder Ihre Shell das SIGCHILD-Signal abfängt und anschließend den Beendigungsstatus Ihres Kindes überprüft.

cjh
quelle
1
@ user13107help trap
Carlos Campderrós
2
Jep. Ich habs. wenn jemand interessiert, hier ist was ich tat pastebin.com/QyeJYYHC
user13107
1
Der Shell- trapBefehl fängt an die Shell gesendete Signale ab . Es wird also nicht funktionieren, denjenigen zu fangen, der an Ihr Programm gesendet wird.
Derobert
1
@ warl0ck Es ist möglich, einen Segfehler auf die gleiche Weise zu erfassen, wie Sie jedes Signal erfassen. Dies kann jedoch zu undefiniertem Verhalten führen. Wenn Sie jedoch wissen, was Sie tun, können Sie möglicherweise zumindest auf vernünftige Weise sterben. Das OP wollte nach stderr drucken, in diesem Fall ist das Erkennen des Segfault und das Drucken sicher.
cjh 31.10.12
1
@ warl0ck: du kannst, es ist nur eine sehr schlechte Idee, irgendetwas im Handler zu tun, aber zu protokollieren und zu beenden. Es gibt jedoch einige spezielle Anwendungsfälle.
Linuxios
19

Die Meldung "Segmentierungsfehler" wird an stderr ausgegeben, es handelt sich jedoch um den Standardfehler der Shell und nicht um den Standardfehler des Programms. Die Shell gibt diese Meldung aus, wenn sie feststellt, dass das Programm aufgrund eines Signals beendet wurde.

Sie können die Nachricht stumm schalten, indem Sie stderr um den Teil des Shell-Skripts leiten, der das Programm ausführt:

{ ./code; } >&log
Gilles 'SO - hör auf böse zu sein'
quelle