GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener el valor de retorno de CHILD PROCESS?

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.


Linux
  1. ¿Cómo obtener el ID de proceso del proceso en segundo plano?

  2. ¿Cómo hago para que sed lea desde la entrada estándar?

  3. ¿Cómo obtener la identificación del proceso para eliminar un proceso nohup?

  4. Cómo obtener PID del proceso secundario bifurcado en el script de shell

  5. ¿Cómo obtener PID por nombre de proceso?

Cómo encontrar el nombre del proceso a partir de su PID

Cómo obtener un proceso secundario del proceso principal

¿Cómo obtener el nombre de host de IP (Linux)?

¿Cómo canalizar la salida de grep a cp?

¿Cómo obtener el PID principal de un proceso determinado en GNU/Linux desde la línea de comandos?

Cómo obtener pid del proceso recién iniciado