Tiro de temporada
Tengo un ejecutable de C++ llamado Test
. quiero averiguar el GetExitCodeProcess()
código cuando se completa la ejecución.
Puedo averiguar el código de estado escribiendo lo siguiente en otro programa contenedor como tal:
...
int status = system("./Test");
y luego verifique los estados de WIFSIGNALED / WIFSTOPPED, etc.
Sin embargo, en lugar de escribir un programa contenedor, ¿puedo obtener el código de estado de salida del PID del .Test
programa escribiendo un intento ¿guion?
Editar: ¿Escribir un $
en el intento después de ejecutar ./Test
dar la solución al problema anterior?
Editar: El resumen es: cuando ejecuto un ejecutable desde la línea de comando, ¿cómo obtengo (no un programa) el estado de salida?
Inian
Simplemente puede hacer un echo $?
después de ejecutar el comando/bash que generará el código de salida del programa.
Cada comando devuelve un estado de salida (a veces denominado estado de retorno o código de salida). Un comando exitoso devuelve un 0
, mientras que uno fallido devuelve un valor distinto de cero que normalmente se puede interpretar como un código de error. bien educado UNIX
comandos, programas y utilidades devuelven un 0
código de salida al completarse con éxito, aunque hay algunas excepciones.
# Non-zero exit status returned -- command failed to execute.
echo $?
echo
# Will return 113 to shell.
# To verify this, type "echo $?" after script terminates.
exit 113
# By convention, an 'exit 0' indicates success,
# while a non-zero exit value means an error or anomalous condition
Alternativamente, si desea identificar el código de retorno para un proceso/secuencia de comandos en segundo plano (comenzado con nohup
o ejecutar en segundo plano &
operador) puede iniciar el pid del proceso/secuencia de comandos y esperar a que finalice y luego obtener el código de salida.
# Some random number for the process-id is returned
./foo.sh &
[1] 28992
# Get process id of the background process
echo $!
28992
# Waits until the process determined by the number is complete
wait 28992
[1]+ Done ./foo.sh
# Prints the return code of the process
echo $?
0
También eche un vistazo a Bash Hackers Wiki – Estado de salida
-
No creo que lo haga, b/c system() ya le está dando la misma información $? lo hace. Si bien esta respuesta ha recibido votos a favor, se aplica a un script bash que llama a otro script, no a un programa C++ que llama a un script bash. Desde mi comprensión del OP.
– San Hax
26 de abril de 2016 a las 10:14
-
Si no recuerdo mal, desde el OP ‘Sin embargo, en lugar de escribir un programa contenedor, ¿puedo obtener el código de estado de salida del pid del programa .Test escribiendo un script bash?’ que es básicamente un script bash llamando a otro script. Estoy bien para eliminar la publicación si se considera irrelevante, lo que en este caso no lo es.
– Inian
26 de abril de 2016 a las 10:19
Se está acercando a esto incorrectamente: system() ya devuelve el estado existente: cero para éxito, distinto de cero para falla. Lo que probablemente sucede es que su script de “Prueba” está escrito incorrectamente o está probando el “estado” incorrectamente. He visto los siguientes errores de secuencias de comandos de los desarrolladores.
run_some_java
echo "Done"
En ningún momento están rastreando el código de salida, el script devuelve el último código de salida, del comando echo. Lo que hace que siempre tenga éxito. Aquí hay dos formas de salir correctamente (y sé que otros codificadores piensan que algunas formas más avanzadas son mejores que esta primera, pero no creo que de eso se trate este hilo). Gatear, luego caminar, luego correr.
Si necesita el estado de salida, pero desea que se ejecuten todos los comandos de shell.
return_code=0
mv $letters $ARCHIVE
return_code=$(($return_code + $?))
mv $letters $ARCHIVE
return_code=$(($return_code + $?))
exit $return_code
Si desea salir de la falla, hay set -e
para investigar, y aquí hay otra manera.
mv $letters $ARCHIVE || exit 1
mv $letters $ARCHIVE || exit 2
Está usando c++ para llamar al script, use c++ para obtener el estado de salida; no llame a otro script, hay demasiadas cosas sucediendo de esa manera.
– San Hax
25 de abril de 2016 a las 10:31