Warum, wenn ich den Beendigungscode $? In Perl um acht verschiebe, bekomme ich 255, wenn ich erwarte, dass es -1 ist?Warum ist der Exit Code 255 statt -1 in Perl?
Antwort
Der von 'wait()' zurückgegebene Beendigungsstatus ist ein 16-Bit-Wert. Von diesen 16 Bits stammen die höherwertigen 8 Bits aus den niederwertigen 8 Bits des von 'exit()' zurückgegebenen Werts - oder des von main()
zurückgegebenen Werts. Wenn das Programm auf natürliche Weise abstirbt, sind die niederwertigen 8 Bits der 16 alle Null. Wenn das Programm aufgrund eines Signals abstirbt, codieren die 8 Bits niedriger Ordnung die Signalnummer und ein Bit, das anzeigt, ob ein Kern-Dump stattgefunden hat. Bei einem Signal wird der Exit-Status als Null behandelt - Programme wie die Shell neigen dazu, die niederwertigen Bits, die nicht Null sind, als Fehler zu interpretieren.
15 8 7 0 Bit Position
+-----------------+
| exit | signal |
+-----------------+
Die meisten Maschinen speichern den 16-Bit-Wert tatsächlich in einer 32-Bit-Ganzzahl, und das wird mit vorzeichenloser Arithmetik behandelt. Die höherwertigen 8 Bits der 16 können alle 1 sein, wenn der Prozeß mit 'exit (-1)' beendet wird, aber das wird als 255 erscheinen, wenn es um 8 Bits nach rechts verschoben wird.
Wenn Sie den Wert wirklich in eine vorzeichenbehaftete Menge umwandeln möchten, müssten Sie auf der Basis des 16. Bits ein bisschen drehen.
$status >>= 8;
($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status;
Wohin verlagern Sie es? Bitte geben Sie ein Codebeispiel an.
auch:
perldoc -f system
gibt ein sehr einfaches Beispiel zu verstehen, was mit $ zu tun? Auch
, http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html
Exit-Werte sollte zwischen 0 und 255. Ihre kombinierte Verschiebung mit, wie negative Werte werden durch den Computer tatsächlich gespeichert sollte einen kleinen Einblick geben.
Ich habe es um 8 Bits verschoben – syker
Perl gibt einen Subprozess Exit-Code in der gleichen Weise wie bei der C-Laufzeitbibliothek Makro WEXITSTATUS
, die die folgende Beschreibung in wait(2)
hat:
WEXITSTATUS(status) evaluates to the least significant eight bits of the return code of the child which terminated, which may have been set as the argument to a call to exit() or as the argument for a return statement in the main program. This macro can only be evaluated if WIFEXITED returned non-zero.
Der wichtige Teil ist hier die niedrigstwertigen acht Bits. Dies ist, warum Sie einen Exit-Code von 255. Die perlvar
Manpage beschreibt $?
immer wie folgt:
$? The status returned by the last pipe close, backtick (‘‘) com- mand, successful call to wait() or waitpid(), or from the sys- tem() operator. This is just the 16-bit status word returned by the wait() system call (or else is made up to look like it). Thus, the exit value of the subprocess is really ("$? >> 8"), and "$? & 127" gives which signal, if any, the process died from, and "$? & 128" reports whether there was a core dump.
Es gibt keine spezielle Handhabung hier für negative Zahlen in dem Exit-Code.
Awesome Antwort! – syker
- 1. PHPSstorm - Prozess beendet mit Exit-Code 255
- 2. Weird SSIS Fehler (Prozess Exit Code 255)
- 3. Libtool ist fehlgeschlagen mit Exit Code 1
- 4. ibtool mit Exit Code 255 in Xcode 6-Beta fehlgeschlagen
- 5. Warum Color.FromArgb (255, 255, 255, 255)! = Farbe.Weiß?
- 6. Ausführen von Perl-Skript von Java Tomcat gibt immer 255 Exit-Code
- 7. Fehler swiftc fehlgeschlagen mit Exit-Code 1
- 8. Linker-Befehl fehlgeschlagen mit Exit-Code 1 - nicht sicher, warum
- 9. Exit Wenn kein perl pm verfügbar ist
- 10. copypng fehlgeschlagen mit Exit Code 1
- 11. Warum ersetzt Perl meine Zeichenfolge durch "1"?
- 12. Der DT_BOOL-Wert von TRUE wird in einem Tinyint-Feld auf 255 abgebildet. Warum nicht 1?
- 13. Exit-Code von ssh Befehl
- 14. Warum 1 << 4 statt 16?
- 15. Warum ist der Refcount 2 nicht 1?
- 16. Warum ist Perls $? den falschen Wert für den Exit-Code eines gegabelten Prozesses zurückgeben?
- 17. Linker-Befehl fehlgeschlagen mit Exit-Code 1 (Reagieren nativ - IOS)
- 18. Warum Funkenjob nicht mit „Exit-Code: 52“
- 19. Was ist der Umfang von $ 1 bis $ 9 in Perl?
- 20. "aapt.exe" verlassen mit Code 255
- 21. Warum denkt Perl, dass '1 und 0' wahr ist?
- 22. Objekt-C-Linker-Befehl fehlgeschlagen mit Exit-Code 1
- 23. Befehl /Applications/Xcode-beta.app/Contents/Developer/usr/bin/actool fehlgeschlagen mit Exit-Code 255
- 24. AS400 Java Java-Programm mit Exit-Code abgeschlossen 1
- 25. Exit-Code umgeleiteter Befehl
- 26. JVM beendet mit Exit Code 1 beim Zugriff auf JFrame
- 27. Cocoapods installieren, dann "Linker-Befehl mit Exit-Code 1 fehlgeschlagen"
- 28. Linker Befehl mit Exit-Code fehlgeschlagen 1: doppeltes Symbol
- 29. Swift: Fehler: Linker-Befehl mit Exit-Code 1 fehlgeschlagen
- 30. gcc-4.2 fehlgeschlagen mit Exit code 1 iphone
Vielleicht könnten Sie erklären, warum Sie erwarten, dass der Exit-Code -1 ist. –
Bitte zeigen Sie den Perl-Code an. Welches Programm/Skript gibt den Exit-Code aus, welches Skript meldet es? – lexu
'perl -e" Ausgang -1 "; echo $? '=> 255. – jrockway