2010-04-28 15 views
7

¿Por qué cuando cambio el código de salida, $ ?, en Perl por ocho, obtengo 255 cuando espero que sea -1?¿Por qué es el código de salida 255 en lugar de -1 en Perl?

+6

Quizás podría explicar por qué espera que el código de salida sea -1. –

+3

Muestra el código de Perl. ¿Qué programa/script 'emite' el código de salida, qué script lo informa? – lexu

+4

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

Respuesta

20

El estado de salida devuelto por 'wait()' es un valor de 16 bits. De esos 16 bits, los 8 bits de orden superior provienen de los 8 bits de orden inferior del valor devuelto por 'exit()' - o el valor devuelto por main(). Si el programa muere naturalmente, los 8 bits de bajo orden de los 16 son todos cero. Si el programa muere debido a la señal, los 8 bits de orden inferior codifican el número de señal y un bit que indica si ocurrió un volcado del núcleo. Con una señal, el estado de salida se trata como cero: los programas como el intérprete tienden a interpretar los bits de orden inferior distintos de cero como un error.

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

mayoría de las máquinas en realidad almacenar el valor de 16 bits en un entero de 32 bits, y que se maneja con la aritmética sin signo. Los 8 bits de orden superior del 16 pueden ser todos 1 si el proceso salió con 'exit (-1)', pero eso aparecerá como 255 cuando se desplace 8 bits hacia la derecha.

Si realmente desea convertir el valor en una cantidad firmada, tendría que hacer algunos movimientos de bits basados ​​en el 16º bit.

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

Ver también SO 774048 y SO 179565.

0

¿De qué manera lo estás cambiando? Proporcione un ejemplo de código.

también:

perldoc -f system 

da un muy fácil de ejemplo para entender de qué hacer con $?

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

valores de salida deben estar entre 0 y 255. El desplazamiento de combinarse con cómo los valores negativos son realmente almacenados por el ordenador debe dar una idea.

+0

Lo estaba cambiando por 8 bits – syker

10

Perl devuelve un código de salida subproceso en la misma forma que la biblioteca de tiempo de ejecución C macro WEXITSTATUS, que tiene la siguiente descripción en 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 aquí es la ocho bits menos significativos. Esta es la razón de que está recibiendo el código de salida 255. La página de manual describe perlvar$? de la siguiente manera:

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

No hay un tratamiento especial aquí para los números negativos en el código de salida.

+0

Awesome answer! – syker

Cuestiones relacionadas