GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir la valeur de retour 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

Référence

La page de manuel pour waitpid montre que sa signature de type est :

pid_t waitpid(pid_t pid, int *stat_loc, int options);

Il indique également que nous pouvons stocker des informations de processus avec le stat_loc argument :

si la valeur de l'argument stat_loc n'est pas un pointeur nul, les informations doivent être stockées à l'emplacement pointé par stat_loc

le stat_val l'argument est la valeur entière pointée par stat_loc .

Nous utilisons alors WEXITSTATUS(wstatus) pour extraire notre valeur de retour du processus.

WEXITSTATUS(stat_val ):Si la valeur de WIFEXITED(stat_val) est différente de zéro, cette macro évalue les 8 bits de poids faible de l'argument d'état que le processus enfant a transmis à _exit() ou exit(), ou la valeur processus enfant renvoyé par main().


Oops! Ce n'est pas bas ! Quoi qu'il en soit...

La raison de la création d'un processus est de continuer le flux principal, en faisant quelque chose pendant ce temps qui n'affecte pas cela. Je parcours des répertoires d'images 10k et je supprime les doublons. Je mets le code de comparaison dans une fonction et un sous-processus. C'est très rapide.

La façon de récupérer une valeur est de créer un tube, d'y faire écho une valeur puis de lire le tube :(Attention ! le code suivant ne fonctionne probablement pas, il affiche simplement un tube fonctionnel)

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"

Le seul problème jusqu'à présent est que je travaille sur une clé USB et que les autorisations m'empêchent de créer le canal. A part ça...


Ce que vous recherchez est wait() ou waitpid().


Comme dtmilano a dit que vous devriez utiliser wait ou waitpid, selon vos besoins.

Mais peut-être devriez-vous diviser votre programme en deux parties et exécuter le fils avec exec. Lorsque vous créez un fork, votre processus enfant reçoit un pid égal à 0 et je ne sais pas si vous essayez d'attendre des signaux de processus avec un pid 0, cela fonctionnera correctement.

Quoi qu'il en soit, vous pouvez passer, même si ce n'est pas la meilleure façon, la valeur calculée par votre processus enfant jusqu'à la sortie.


Linux
  1. Comment trouver tous les processus enfants ?

  2. Comment obtenir l'ID de processus du processus d'arrière-plan ?

  3. Comment obtenir un processus enfant à partir d'un processus parent

  4. Comment obtenir le PID par nom de processus ?

  5. valeur de retour du script python au script shell

Comment trouver le nom du processus à partir de son PID

comment obtenir des éléments de la liste en bash?

Comment obtenir le PID parent d'un processus donné sous GNU/Linux à partir de la ligne de commande ?

Comment obtenir un masque de réseau à partir de bash ?

Comment empêcher un processus d'écrire des fichiers

Comment obtenir le pid du processus qui vient de démarrer