system () gibt gelegentlich 2 zurück

8

Ich habe eine Funktion mit system() Bibliotheksfunktion wie folgt codiert:

%Vor%

Dann habe ich es mit einem Shell-Skript wie folgt aufgerufen:

%Vor%

Aber manchmal gab es einen ungeraden Rückkehrcode von 2, wie unten:

%Vor%

Ich würde gerne verstehen, warum es einen Rückgabecode von 2 gab.

================ neue 2015/06/12 13:54 ================================= ======

Ich habe festgestellt, dass, wenn das System () 2 zurückgibt, eine Fehlermeldung von bash wie folgt auftrat:

%Vor%     
Hetiu 12.06.2015, 01:34
quelle

1 Antwort

8

Der Statuscode 2 wird von Ihrer Shell zurückgegeben. Ohne viel mehr Details wird es schwierig sein zu diagnostizieren. Das Hinzufügen der tatsächlichen Fehlermeldung, die von der Shell erzeugt wurde, war nützlich.

Wenn Ihre Shell bash ist - wie es jetzt aussieht - dann zeigt der Status-Return-Code von 2 einen Speicherzuweisungsfehler an, der durch die von bash erzeugte Fehlermeldung bestätigt wird:

%Vor%

Zeile 73 ist, soweit ich sehen kann, die erste Speicherzuweisung, die von einem neu gestarteten Prozess bash ausgeführt wird (was durch die Fehlermeldung bestätigt wird, dass noch keine Bytes zugewiesen wurden), so dass es wahrscheinlich erscheint Das Problem ist, dass malloc keinen Speicher zuordnen kann.

Es ist möglich, dass wirklich kein Speicher verfügbar ist, insbesondere wenn Sie auf einem stark ausgelasteten System arbeiten, auf dem kein Swap konfiguriert ist. Aber es gibt ein paar Hinweise im Internet, die darauf hinweisen, dass dies mit Speicherschutzoptionen zu tun haben könnte; insbesondere Konfigurationen, in denen sbrk nicht verfügbar ist, aber die malloc -Bibliothek erwartet, dass sie verwendet werden kann.

Sie können eine weitere Diagnose starten, indem Sie überprüfen, ob es möglich ist, neue Shells zuverlässig zu starten:

%Vor%

Eine frühere Schätzung, die für jemand anderen von Nutzen sein könnte. Die Korrektur des Aufrufs von exit wird empfohlen, obwohl es wahrscheinlich nichts mit dem speziellen Problem in dieser Frage zu tun hat.

Die dash -Shell, die von verschiedenen Distributionen als /bin/sh -Implementierung verwendet wird, gibt den Statuscode 2 zurück, wenn die Shell aufgrund einer Fehlerbedingung beendet wird.

Ein möglicher Schuldiger aus dem obigen Skript ist

%Vor%

Status Return Codes sind vorzeichenlose 8-Bit-Werte; Mit anderen Worten, die zulässigen Rückgabecodes liegen zwischen 0 und 255. -1 liegt nicht in diesem Bereich und Sie sollten sie nicht in einem Aufruf von exit verwenden.

Bashs exit builtin (wie die C exit -Funktion) verwendet einfach das niederwertige Byte des übergebenen Returncodes, also hätten Sie bei bash einen Returncode von 255 gesehen. Aber das Bindestrich exit erwartet sein Argument ist eine vorzeichenlose Zahl und beschwert sich, dass -1 keine gültige Zahl ist.

Da exit ein spezielles Built-in ist und die Shell nicht interaktiv ist, führt der Fehler dazu, dass die Shell beendet wird, wie in der Posix-Standard . Dash setzt den Exit-Code auf 2, wenn es wegen eines Shell-Fehlers beendet wird.

    
rici 12.06.2015, 03:27
quelle

Tags und Links