TLDR
int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus
Referenz
Die Manpage für waitpid
zeigt seine Typsignatur ist:
pid_t waitpid(pid_t pid, int *stat_loc, int options);
Es besagt auch, dass wir Prozessinformationen mit dem stat_loc
speichern können Argument:
wenn der Wert des Arguments stat_loc
kein Nullzeiger ist, sollen Informationen an der Stelle gespeichert werden, auf die stat_loc
zeigt
die stat_val
argument ist der ganzzahlige Wert, auf den stat_loc
zeigt .
Wir verwenden dann WEXITSTATUS(wstatus)
um unseren Rückgabewert aus dem Prozess zu extrahieren.
WEXITSTATUS(stat_val
):Wenn der Wert von WIFEXITED(stat_val) ungleich Null ist, wertet dieses Makro die niederwertigen 8 Bits des Statusarguments aus, das der untergeordnete Prozess an _exit() oder exit() übergeben hat, oder den Wert the untergeordneter Prozess, der von main() zurückgegeben wird.
Hoppla! Das ist kein Bash! Jedenfalls...
Der Grund für das Spawnen eines Prozesses besteht darin, den Hauptfluss fortzusetzen und in der Zwischenzeit etwas zu tun, das diesen nicht beeinflusst. Ich gehe Verzeichnisse mit 10.000 Bildern durch und verschiebe Duplikate. Ich habe den Vergleichscode in eine Funktion und einen Unterprozess eingefügt. Es ist sehr schnell.
Der Weg, einen Wert zurückzubekommen, besteht darin, eine Pipe zu erstellen, einen Wert darauf zu echoen und dann die Pipe zu lesen:(Warnung! Der folgende Code funktioniert wahrscheinlich nicht, er zeigt nur eine funktionierende Pipe)
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"
Das einzige Problem bisher ist, dass ich an einem USB-Laufwerk arbeite und Berechtigungen mich daran hindern, die Pipe zu erstellen. Abgesehen davon ...
Was Sie suchen, ist wait() oder waitpid().
Wie dtmilano sagte, sollten Sie je nach Bedarf wait oder waitpid verwenden.
Aber vielleicht sollten Sie Ihr Programm in zwei Teile aufteilen und den Sohn mit exec ausführen. Wenn Sie einen Fork machen, erhält Ihr untergeordneter Prozess pid gleich 0 und ich weiß nicht, ob Sie versuchen zu warten, dass Signale des Prozesses mit pid 0 gut funktionieren.
Trotzdem können Sie, obwohl es nicht der beste Weg ist, den von Ihrem untergeordneten Prozess berechneten Wert durch exit übergeben.