GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere un valore di ritorno da CHILD PROCESS?

TLDR

int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus

Riferimento

La manpage per waitpid mostra che la sua firma del tipo è:

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

Afferma inoltre che possiamo memorizzare le informazioni di processo con il stat_loc argomento:

se il valore dell'argomento stat_loc non è un puntatore nullo, le informazioni devono essere memorizzate nella posizione indicata da stat_loc

il stat_val argomento è il valore intero puntato da stat_loc .

Usiamo quindi WEXITSTATUS(wstatus) per estrarre il nostro valore di ritorno dal processo.

WEXITSTATUS(stat_val ):Se il valore di WIFEXITED(stat_val) è diverso da zero, questa macro restituisce gli 8 bit di ordine inferiore dell'argomento status che il processo figlio ha passato a _exit() o exit(), o il valore processo figlio restituito da main().


Ops! Questo non è bash! Comunque...

Il motivo per generare un processo è continuare il flusso principale, facendo qualcosa nel frattempo che non lo influisca. Sto scorrendo directory di 10.000 immagini e spostando i duplicati. Inserisco il codice di confronto in una funzione e lo sottoprocesso. È molto veloce.

Il modo per recuperare un valore è creare una pipe, echo un valore su di essa quindi leggere la pipe:(Attenzione! il codice seguente probabilmente non funziona, mostra solo una pipe funzionante)

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"

L'unico problema finora è che sto lavorando su un'unità USB e le autorizzazioni mi impediscono di creare la pipe. A parte questo...


Quello che stai cercando è wait() o waitpid().


Come ha detto dtmilano, dovresti usare wait o waitpid, a seconda delle necessità.

Ma forse dovresti dividere il tuo programma in due parti ed eseguire il figlio con exec. Quando esegui il fork, il tuo processo figlio riceve pid uguale a 0 e non so se provi ad aspettare che i segnali di processo con pid 0 funzioneranno correttamente.

Comunque puoi passare, anche se non è il modo migliore, il valore calcolato dal tuo processo figlio tramite exit.


Linux
  1. Come trovare tutti i processi figlio?

  2. Come faccio a leggere sed dall'input standard?

  3. Come ottenere l'ID del processo per terminare un processo nohup?

  4. Come ottenere il PID dal processo figlio biforcuto nello script della shell

  5. Come ottenere il nome host dall'IP (Linux)?

Come trovare il nome del processo dal suo PID

Come reindirizzare l'output da grep a cp?

come ottenere elementi dalla lista in bash?

Come ottenere netmask da bash?

Come impedire a un processo di scrivere file

Come viene calcolata la priorità del processo?