GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich einen Rückgabewert von CHILD PROCESS?

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.


Linux
  1. Wie finde ich alle untergeordneten Prozesse?

  2. Wie erhalte ich eine Ausgabe von gdb.execute in PythonGDB (GDB 7.1)?

  3. Wie bringe ich sed dazu, von der Standardeingabe zu lesen?

  4. So erhalten Sie einen untergeordneten Prozess aus einem übergeordneten Prozess

  5. Wie bekomme ich den Hostnamen von der IP (Linux)?

So finden Sie den Prozessnamen anhand seiner PID

Wie bekomme ich PID nach Prozessname?

Rückgabewert vom Python-Skript zum Shell-Skript

Wie bekomme ich Elemente aus der Liste in Bash?

Wie erhalte ich die übergeordnete PID eines bestimmten Prozesses in GNU/Linux von der Befehlszeile aus?

Wie bekomme ich eine Netzmaske von Bash?