2010-04-28 12 views
7

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?

+6

Vielleicht könnten Sie erklären, warum Sie erwarten, dass der Exit-Code -1 ist. –

+3

Bitte zeigen Sie den Perl-Code an. Welches Programm/Skript gibt den Exit-Code aus, welches Skript meldet es? – lexu

+4

'perl -e" Ausgang -1 "; echo $? '=> 255. – jrockway

Antwort

20

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; 

Siehe auch SO 774048 und SO 179565.

0

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.

+0

Ich habe es um 8 Bits verschoben – syker

10

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.

+0

Awesome Antwort! – syker

Verwandte Themen