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