Ahoj, potřebuji spustit funkci s názvem test_f a uvnitř té funkce potřebuji sjistit PID te spuštěné funkce test_f. Jde to nějak? Děkuji
shell proměnná $$
Citace od: Danny kdy 06. 11. 2017, 15:21:15
shell proměnná $$
teď jsem si uvědomil, žes nenapsal, v jakém jazyce to chceš: nějak jsem předpokládal shellscipt, nevím proč
PID se neváže k funkcím, ale k procesům
zjistí ho třeba fce getpid() v C
Omlouvám se, jedná se o shell ;) ale stejně PID nesedí
function test_f(){
echo $$ > /pid
}
test_f&
v souboru /pid mám jiný PID než ve skutečnosti ten proces má.
Co znamená to & ? Jestli to, co intuitivně chápu já, tudíž, že to spustí na pozadí, tak se tam udělá fork,
a v něm se spustí funkce test_f, pak pochopitelně do /pid se zapíše tohle pid toho "forku", fork si v
klidu skončí, všechno je vpořádku a pravda, ale v /pid pid toho, v čem běžela ta funkce, ale ne pid
toho hlavního skriptu.
https://unix.stackexchange.com/a/305361
CitaceCurly brace functions will run within the calling shell process, unless they need their own subshell which is:
when you run them in the background with &
when you run them as a link in a pipeline
Ty tam máš background, takže nový PID. Takže http://tldp.org/LDP/abs/html/internalvariables.html - $!, $$, $PPID, $BASHPID
jinak - jste si jisty, ze je dobry napad ukladat neco do /pid, tj. do root adresare? Neni lepsi nekde v tmp udelat uniq. soubor?
Citace od: armabeton kdy 06. 11. 2017, 16:16:07
jinak - jste si jisty, ze je dobry napad ukladat neco do /pid, tj. do root adresare? Neni lepsi nekde v tmp udelat uniq. soubor?
Není je to jen příklad, všechno patří to /tmp
Citace od: pb kdy 06. 11. 2017, 15:59:17
... ale v /pid pid toho, v čem běžela ta funkce, ale ne pid
toho hlavního skriptu.
opačně, ne? ;)
Citace od: Pepa kdy 06. 11. 2017, 16:33:57
Citace od: pb kdy 06. 11. 2017, 15:59:17
... ale v /pid pid toho, v čem běžela ta funkce, ale ne pid
toho hlavního skriptu.
opačně, ne? ;)
Nevím. Vlastně záleží na tom, kdy se to $$ vyhodnotí, a to nevím. Víte to někdo, jen pro úplnost?
ne, v $$ je pid funkce test_f v době jejího spuštění. Výrazy (expression) uzavřené v {} nebo () se vyhodnocují až jejich voláním.
edit:
k původnímu dotazu. Funkce se chová správně, jak už ostatní psali, přidáním & za volání test_f vytvoříš nový proces, v něm si uložíš pid a pak se vrátíš zpět. Neměl bys ale nikdy volat & aniž bys za tím neměl alespoň wait, on se ti totiž ukončil i bash a pokud bys uvnitř test_f měl delší funkci, běží i po ukončení té hlavní, což je super.
Dej pryč ten & a budeš tam mít pid hlavní funkce. Podle tvého dotazu se ale kód chová správně, samotná funkce nemá žádné pid, to má až samotný proces.
On si je zjevně vědom toho, že ta funkce běží v novém procesu, chce to tak a je to naprosto legitimní. Teď chce zjistit PID toho procesu -- dustin už odpověděl, je to v $BASHPID. KONEC!