GNU/Linux >> Znalost Linux >  >> Linux

Jak získat návratovou hodnotu z CHILD PROCESS?

TLDR

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

Reference

Manuálová stránka pro waitpid ukazuje, že jeho typ podpisu je:

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

Také uvádí, že můžeme ukládat informace o procesu pomocí stat_loc argument:

pokud je hodnota argumentu stat_loc není nulový ukazatel, informace musí být uloženy v místě, na které ukazuje stat_loc

stat_val argument je celočíselná hodnota, na kterou ukazuje stat_loc .

Potom použijeme WEXITSTATUS(wstatus) abychom z procesu extrahovali naši návratovou hodnotu.

WEXITSTATUS(stat_val ):Pokud je hodnota WIFEXITED(stat_val) nenulová, toto makro vyhodnotí 8 bitů nízkého řádu argumentu stavu, který podřízený proces předal _exit() nebo exit(), nebo hodnotu podřízený proces vrácený z main().


Jejda! Tohle není bash! Každopádně...

Důvodem pro vytvoření procesu je pokračovat v hlavním toku a mezitím udělat něco, co to neovlivní. Procházím adresáře 10k obrázků a vytahuji duplikáty. Vložil jsem porovnávací kód do funkce a podprocesu, který. Je to velmi rychlé.

Způsob, jak získat hodnotu zpět, je vytvořit rouru, opakovat hodnotu na ní a pak rouru přečíst:(Upozornění! následující kód pravděpodobně nefunguje, jen ukazuje fungující roura)

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"

Jediný problém je zatím v tom, že pracuji na jednotce usb a oprávnění mi brání ve vytváření potrubí. Kromě toho ...


To, co hledáte, je wait() nebo waitpid().


Jak řekl dtmilano, měli byste použít wait nebo waitpid, podle potřeby.

Ale možná byste měli rozdělit svůj program na dvě části a spustit syna pomocí exec. Když uděláte fork, váš podřízený proces bude přijímat pid rovné 0 a já nevím, jestli zkusíte počkat, signály procesu s pid 0 budou fungovat dobře.

Každopádně můžete, i když to není nejlepší způsob, hodnotu vypočítanou vaším podřízeným procesem přes exit.


Linux
  1. Jak získat ID procesu na pozadí?

  2. Jak získat výstup z gdb.execute v PythonGDB (GDB 7.1)?

  3. Jak získat podřízený proces z rodičovského procesu

  1. Jak získat název hostitele z IP (Linux)?

  2. Jak převést výstup z grep do cp?

  3. jak získat prvky ze seznamu v bash?

  1. Jak získat masku sítě z bash?

  2. Jak zabránit procesu v zápisu souborů

  3. Jak získat uživatelské jméno z uid