El código está sacado del ejemplo propuesto en
perldoc -f system:
Using text Syntax Highlighting
Si desea inspeccionar manualmente el error de "system", puede
comprobar todas las posibles causas del error mediante la
inspección de $? como esto:
if ($? == -1) {
print "error al ejecutar: $!\n";
}
elsif ($? & 127) {
printf "hijo muerto con señal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'con' : 'sin';
}
else {
printf "hijo terminó con valor %d\n", $? >> 8;
}
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
La variable especial
$? almacena el valor del resultado de la última ejecución de system (más información en
perldoc perlvar). Según lo que contenga, nos dirá qué es lo que ha pasado en la ejecución.
Si el resultado es un
-1, no se ha podido ejecutar nada. El mensaje de error estará almacenado en
$! (más información en
perldoc perlvar).
Si no es así, entonces se ha podido ejecutar. El resultado de $? será un código almacenado en dos bytes.
El byte más bajo guarda la -posible- señal que hizo terminar bruscamente el programa (en caso de que el programa recibiera una señal de interrupción).
Para saber ese valor, usamos la operación lógica AND: '$? & 127'. 127 son 7 bits puestos a '1': 0b01111111, así que la operación está extrayendo, del byte bajo de $?, sus 7 primeros bits. Si hay algo ahí, el
elsif() se activa y se nos informa que el proceso hijo (el system) ha sido matado por una señal, y nos dice qué señal ha sido.
Si no es así, entonces estamos ante una ejecución normal: el proceso se arrancó y terminó bien. El
resultado de la ejecución (
no la salida) se almacena en el byte alto de $?. Usamos el operador de desplazamiento de bits a la derecha '>>', 8 veces. El resultado es que el byte alto se coloca en la posición del byte bajo, es decir, que de forma efectiva hemos extraído el valor del byte alto. Y eso es lo que se nos muestra en el mensaje.
En el código de tu programa, he sustituido esta última parte con algo más simplificado, para, sencillamente, ver si el $resultado de la ejecución devuelve un valor positivo (mayor que cero) o no. Si es positivo, devuelve EXITOSO. Si es cero, FALLIDO.
Dices que te salen todos los mensajes como FALLIDOS. Quizás la interpretación del resultado de la ejecución no sea la correcta.
Quiero decir: en los sistemas UNIX, cuando un programa se ha ejecutado de forma correcta, siempre devuelve un valor 0. Y es cuando el resultado es distinto de 0 cuando quiere decir que algo -extraño- ha pasado o no ha salido bien.
¿Estás seguro de lo que devuelve php-cgi?