TLDR
int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus
Referencia
La página de manual para waitpid
muestra que su firma de tipo es:
pid_t waitpid(pid_t pid, int *stat_loc, int options);
También establece que podemos almacenar información de procesos con el stat_loc
argumento:
si el valor del argumento stat_loc
no es un puntero nulo, la información se almacenará en la ubicación señalada por stat_loc
el stat_val
argumento es el valor entero apuntado por stat_loc
.
Luego usamos WEXITSTATUS(wstatus)
para extraer nuestro valor de retorno del proceso.
WEXITSTATUS(stat_val
):Si el valor de WIFEXITED(stat_val) no es cero, esta macro evalúa los 8 bits de orden inferior del argumento de estado que el proceso secundario pasó a _exit() o exit(), o el valor que proceso secundario devuelto por main().
¡Ups! ¡Esto no es bash! De todos modos...
La razón para generar un proceso es continuar con el flujo principal, haciendo algo mientras tanto que no afecte eso. Estoy revisando directorios de imágenes de 10k y eliminando duplicados. Puse el código de comparación en una función y subproceso eso. Es muy rápido.
La forma de recuperar un valor es crear una canalización, hacer eco de un valor en ella y luego leer la canalización:(¡Advertencia! El siguiente código probablemente no funcione, solo muestra una canalización que funciona)
mkfifo pipe
moved=0
# Use imageMagick 'compare' to find files with zero difference:
comPare () {
if [[ ! $(compare -metric AE $1 $2) ]]; then
mv $2 moved;
echo 1 > pipe;
else echo 0 > pipe
fi
}
# For every file in the dir, compare it to every other one:
for file1 in $( ls *.bmp | head -n $(( $( ls *.bmp | wc -l) - 1)); do
for file2 in $( ls *.bmp | tail -n $(( $( ls *.bmp | wc -l) - 1)); do
comPare file1 file2 &
moved=$(( $(cat pipe) + 1 ))
done
done
rm pipe
echo "Moved $moved files"
El único problema hasta ahora es que estoy trabajando en una unidad USB y los permisos me impiden crear la tubería. Aparte de eso...
Lo que está buscando es wait() o waitpid().
Como dijo dtmilano, debe usar wait o waitpid, dependiendo o necesite.
Pero tal vez deberías dividir tu programa en dos partes y ejecutar el hijo con exec. Cuando haces una bifurcación, el proceso de tu hijo recibe pid igual a 0 y no sé si intentas esperar señales de proceso con pid 0 funcionará bien.
De todos modos, puede pasar, aunque no es la mejor manera, el valor calculado por su proceso secundario a través de la salida.