2011-09-25 6 views
7

Zrobiłem program przy użyciu fork() i exec*(). Problem polega na tym, że nie mogę stwierdzić sukcesu lub niepowodzenia exec() z procesu nadrzędnego, ponieważ jest on w oddzielnym procesie potomnym. Myślę, że rodzaj sygnalizacji może być użyty do sprawdzenia tego stanu, ale nie mam o tym pojęcia.Standardowe podejście do określania powodzenia lub niepowodzenia fork/exec (gdy rodzic działa jednocześnie)?

  1. Jaki jest zalecany/standardowy/powszechnie stosowany sposób sprawdzenia tego?
  2. A jakie są pułapki, którymi muszę się przejmować, robiąc to?

Pytanie Szczegóły Aktualizacja (przepraszam za pominięcie ważnych szczegółach)

chcę zachować oba procesy są uruchomione, więc nie można po prostu czekać wyjściu z procesu potomnego. Innymi słowy, chcę być powiadamiany o procesie potomnym "exec sukces lub porażka.

+0

Czy wiesz, że możesz sprawdzać status podrzędny bez blokowania, używając opcji 'waitpid' i' WNOHANG'? W zależności od twojego systemu możesz mieć również 'wait3' i' wait4', które również rozumieją tę flagę. A może chcesz zasygnalizować coś rodzicowi, utrzymując dziecko w ruchu (jak przy semaforach IPC)? – DarkDust

+0

@DarkDust Chcę, aby oba procesy były uruchomione i chcę otrzymywać powiadomienie o procesie potomnym "exec". (sukces lub porażka) Och, oczyściłeś moje pytanie. Dzięki :) – Eonil

+1

możliwy duplikat [Co może spowodować awarię exec? Co dalej?] (Http://stackoverflow.com/questions/3703013/what-can-cause-exec-to-fail-what-happens-next) (W szczególności zobacz [odpowiedź od "R."] (http://stackoverflow.com/questions/3703013/#3703179)) – Nemo

Odpowiedz

7

Twój proces macierzysty może użyć pid procesu podrzędnego, aby wykryć, że jest on żywy lub zakończył działanie (i może rozróżnić kod błędu oraz zginąć z powodu błędów, patrz waitpid). Możesz użyć określonych kodów błędów lub sygnałów, aby powiadomić rodzica o konkretnych przypadkach błędu (np. W rozwidlonym dziecku przed uruchomieniem), ale dla całkowicie ogólnego dziecka, możesz nie być w stanie zarezerwować żadnych kodów wyjścia lub sygnałów (ponieważ rodzic nie będzie mógł stwierdzić, czy exec się powiódł, a następnie dziecko zakończyło z tymi wartościami).

Innym często stosowanym podejściem jest utworzenie pary fd dla rur (patrz układ "rura") i przekazanie jednego końca do elementu podrzędnego (zwykle koniec zapisu), a drugiego do elementu nadrzędnego. Dziecko może użyć tego do wysłania określonych kodów błędów do rodzica. I rodzic może wykryć przedwczesne zakończenie, jeśli rura jest zamknięta bez uzyskania żadnych danych. Istnieje kilka pułapek: SIGPIPE zostanie wysłane do rodzica, jeśli odczytane zostanie na rurze bez aktywnych pisarzy, a użycie fd (innego niż stdin/stdout/stderr) w procesie potomnym może zmylić niektóre źle napisane procesy potomne (chociaż close-on-exec może pomóc to naprawić).

Ogólnie, cały kod, który widziałem, aby sprawić, że fork + exec jest solidny, jest dość hackowaty.

Powiązane problemy