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 dastat_loc
il
stat_val
argomento è il valore intero puntato dastat_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.