Souběh při fork()

Michal Dobes dobes na tes.eu
Pondělí Červenec 28 11:57:12 CEST 2008


Ladislav Vaiz napsal(a):
> narazil jsem na zajímavý problém, který nevím jak korektně vyřešit. V 
> aplikaci spouštím child proces klasicky pipe(), fork(), execlp(). Rodič 
> čte stdout a stderr od dítěte. Někdy se child ukončí hodně rychle a 
> souběh u rodiče je takový, že se vyvolá SIGCHLD ještě před přiřazením 
> pid do proměnné (zřejme ještě v knihovní funkci fork). Obsluha sigchld 
> pak neví, které dítě skončilo, protože v oné proměnné je stále nula.
> 
> Vyvolání sleep před execlp je prasečinka, protože mi nikdo nezaručí, že 
> rodiči nebude trvat déle předat pid do proměnné. I když věřím, že v 
> praxi by to většinou fungovalo. Jak toto zajistit korektně?

Otázka s předběhnutím konce potomka před návratem z forku rodiče
a vyvoláním handleru na SIGCHLD v nevhodnou dobu se řeší pomocí
maskování signálů. Před voláním fork zamaskujte doručení SIGCHLD
procesu, forkněte a pak si jej opět povolte (v potomku i rodiči).
Máte jistotu, že SIGCHLD v rodiči se doručí až po nastavení proměnné
pid v tom pid=fork(). Viz sigprocmask().

M.



Další informace o konferenci Linux