¿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?
Respuesta
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;
¿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.
Lo estaba cambiando por 8 bits – syker
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.
Awesome answer! – syker
- 1. ¿Por qué Color.FromArgb (255, 255, 255, 255)! = Color.White?
- 2. Error extraño de SSIS (Código de salida del proceso 255)
- 3. ¿Qué es "1"? en una fuente de Perl?
- 4. Arrays de Java: ¿por qué la salida es '1'?
- 5. ¿Qué significa $ 1 en Perl?
- 6. ¿Por qué Perl reemplaza mi cadena con "1"?
- 7. MySQL: ¿Por qué usar VARCHAR (20) en lugar de VARCHAR (255)?
- 8. ¿Cuál es el alcance de $ 1 a $ 9 en Perl?
- 9. Perl: ¿Por qué no eval '/(...)/' establece $ 1?
- 10. ¿Por qué se debería usar "movl $ 1,% eax" en lugar de, por ejemplo, "movb $ 1,% eax"
- 11. ¿Qué significa "1"? significa en Perl?
- 12. CGContextSetLineWidth (contexto, 1) - el ancho es de casi alwayas al menos 2 píxeles en lugar 1
- 13. Código postal con salida de lista en lugar de tupla
- 14. ¿Qué es @. en Perl?
- 15. perl $ | = 1; ¿Que es esto?
- 16. JVM terminado. Código de salida = -1
- 17. En Objective-C, ¿por qué este incremento en 4 en lugar de 1?
- 18. ¿Por qué un [:] = 1 es fundamentalmente diferente de un [:] = '1'?
- 19. ¿Cómo puedo embellecer el código de Perl generado por Perl?
- 20. ¿Por qué MySQL interpreta Boolean como TINYINT (1) en lugar de BIT (1)?
- 21. SQL: ¿Es eficiente usar tinyint en lugar de Integer si mi valor máximo es 255?
- 22. ¿Por qué ~ 0 es -1?
- 23. Por qué este código es válido: "(1, eval) ('this')"
- 24. libtool Comando falló con el código de salida 1
- 25. ¿Qué debo usar en lugar de printf en Perl?
- 26. ¿Por qué el recuento es 2 no 1?
- 27. ¿Por qué -1 >> 1 es -1? ¡Y 1 >> 1 es 0!
- 28. Es "VARCHAR (255) CHARACTER SET utf8" de 255 bytes o 255 caracteres
- 29. ¿Por qué es el resultado de 1/3 == 0?
- 30. copypng falló con el código de salida 1
Quizás podría explicar por qué espera que el código de salida sea -1. –
Muestra el código de Perl. ¿Qué programa/script 'emite' el código de salida, qué script lo informa? – lexu
'perl -e" exit -1 "; echo $? '=> 255. – jrockway