2010-04-28 1 views
7

Perché quando cambio il codice di uscita, $?, In Perl per otto, ottengo 255 quando mi aspetto che sia -1?Perché il codice di uscita 255 invece di -1 in Perl?

+6

Forse potresti spiegare perché ti aspetti che il codice di uscita sia -1. –

+3

Si prega di mostrare il codice Perl. Quale programma/script "emette" il codice di uscita, quale script lo segnala? – lexu

+4

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

risposta

20

Lo stato di uscita restituito da "wait()" è un valore a 16 bit. Di questi 16 bit, gli 8 bit di ordine superiore provengono dagli 8 bit di basso valore del valore restituito da "exit()" o dal valore restituito da main(). Se il programma muore in modo naturale, gli 8 bit di basso livello dei 16 sono tutti a zero. Se il programma muore a causa del segnale, gli 8 bit di basso codice codificano il numero del segnale e un bit indica se si è verificato un core dump. Con un segnale, lo stato di uscita viene considerato come zero - programmi come la shell tendono a interpretare i bit di ordine inferiore diversi da zero come un errore.

15  8 7  0 Bit Position 
+-----------------+ 
| exit | signal | 
+-----------------+ 

maggior parte delle macchine effettivamente memorizzare il valore a 16 bit in un numero intero di 32 bit, e che sono trattati con aritmetica senza segno. Gli 8 bit di ordine superiore del 16 possono essere tutti 1 se il processo esce con 'exit (-1)', ma che apparirà come 255 quando spostato a destra di 8 bit.

Se si desidera veramente convertire il valore in una quantità firmata, è necessario eseguire un po 'di smistamento basato sul 16 ° bit.

$status >>= 8; 
($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status; 

Vedi anche SO 774048 e SO 179565.

0

In che modo lo spostate? Si prega di fornire un esempio di codice.

anche:

perldoc -f system 

dà una molto facile da capire esempio di ciò che a che fare con $?

Inoltre, http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html

valori di uscita dovrebbe essere compreso tra 0 e 255. Il tuo shifting insieme a quanto valori negativi sono in realtà memorizzati dal computer dovrebbe dare una certa comprensione.

+0

Lo stavo spostando a destra di 8 bit – syker

10

Perl restituisce un codice di uscita sottoprocesso nello stesso modo che la libreria runtime C macro WEXITSTATUS, che ha la seguente descrizione in wait(2):

 
    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. 

La parte importante qui è la meno significativo otto bit. Questo è il motivo per cui si stanno ottenendo un codice di uscita 255. La pagina di perlvar uomo descrive $? come segue:

 
    $?  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. 

Non v'è alcun trattamento speciale qui per i numeri negativi nel codice di uscita.

+0

Risposta stupenda! – syker