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?
risposta
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;
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.
Lo stavo spostando a destra di 8 bit – syker
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.
Risposta stupenda! – syker
Forse potresti spiegare perché ti aspetti che il codice di uscita sia -1. –
Si prega di mostrare il codice Perl. Quale programma/script "emette" il codice di uscita, quale script lo segnala? – lexu
'perl -e" exit -1 "; echo $? '=> 255. – jrockway