2010-05-19 6 views

Antwort

22

C99-Standard besagt, dass assert Anrufe abort und die abort Sachen Staaten dies über den Rückgabecode:

Eine Implementierung definierte Form des Status erfolglose Beendigung der Host-Umgebung mittels der Funktion zurückgegeben wird Anruf erhöhen (SIGABRT).

Es ist in Abschnitt 7.2.1.1 (assert) und 7.20.4.1 (abort) des c99 Standards here dokumentiert.

Viele UNIX-Systeme geben 128 plus die Signalnummer (SIGABRT ist Signalnummer 6) zurück, so dass Sie 134 erhalten können. Was auch immer Sie erhalten, sollte durch die C-Implementierung dokumentiert werden.

Zum Beispiel siehe here für gcc. Obwohl es ziemlich still darüber ist, was in die aufrufende Umgebung zurückkehrt. Von den spezifischen Abschnitten here:

Einige Auswahlmöglichkeiten werden von der Bibliothek und dem Betriebssystem (oder einer anderen Umgebung bei der Erstellung für eine freistehende Umgebung) getroffen; Details finden Sie in der Dokumentation.

Und here:

Das Verhalten der meisten dieser Punkte sind abhängig von der Implementierung der C-Bibliothek, und nicht von GCC selbst definiert.

So ist die Glibc Doco here auf Programm Beendigung (insbesondere die Ausfahrt Status-Bit). Es erwähnt Konventionen, aber keine festen Regeln.

+0

Das ist eine fantastische Antwort, und 134 ist genau das, was ich bekomme. –

+0

Die mit der Dokumentation für GCC verknüpfte Seite scheint nichts von Interesse zu enthalten, noch kann ich das Zitat finden, das Sie gemacht haben. –

+0

Sie könnten den Glibc-Doco-Link so ändern, dass er direkt auf diesen verweist, es sei denn, ich habe etwas übersehen. http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status –

2

Es ist implementierungsspezifisch. Sie können dies tun:

int main() 
{ 
    assert(0); 
} 

es dann laufen:

> ./a.out 
> echo $? 
1 (<- or whatever) 

Das wird zumindest sagen, was für Ihr Setup zu erwarten. Ich bin Gettitng 134 auf ein paar Linux-Boxen mit gcc und g ++.

+3

Sie sollten Ihre Antworten immer mit einem bestimmten Verweis auf den Standard sichern. – wilhelmtell

+1

Compiler folgen nicht immer dem Standard zum T. (Ich sehe dich an Microsoft) Es ist zwar gut zu wissen, was der Standard sagt - es ist aber genauso gut zu wissen, was Compiler wirklich machen. Was sie tun sollten, ist nicht immer das, was sie tatsächlich tun. Das und der Standard ist nicht wirklich frei. –

-1

Ich arbeitete mit Posix Message Queues Ich habe den gleichen Fehler mq_open wurde mit Fehler 38 (ENOSYS) fehlgeschlagen.

Die Arbeit ist um den Kernel mit POSIX MESSGE QUEUE in der Kernel-Konfiguration aktiviert wiederherzustellen.

Dies wird den Kernel mit POSIX-Nachrichtenwarteschlange Unterstützung bauen und es funktionierte für mich.

Thank

+1

Ich denke, Sie wollten diese Antwort auf eine andere Frage stellen. –

0

ich nicht die eigentliche Spezifikation für sie (POSIX ist ziemlich schwer zu suchen), finden aber ich einen Hinweis gefunden hat.

Eine ausgelöste Assertion führt zu einem Exit-Status, der dem entspricht, was auch immer EXIT_FAILURE expandiert (reference).Da es sich um Linux handelt, handelt es sich auch um POSIX, das das Verhalten von c99 weiter definiert.

Verwandte Themen