2009-08-03 11 views
5

Piszę program, który musi wykonać inne procesy zewnętrzne; teraz program uruchamia linie poleceń procesów przez popen, pobiera dane wyjściowe, a następnie przechwytuje status wyjścia przez pclose.Alternatywy dla popen/pclose?

Co jednak dzieje się w przypadku szybko działających procesów (np. Szybko wystartowane błędy procesu), połączenie PClose nie może uzyskać statusu wyjścia (pclose zwraca -1, errno jest ECHILD).

Czy istnieje sposób naśladowania zachowania typu popen/pclose, z wyjątkiem sposobu, który gwarantuje przechwytywanie "zdarzenia" końcowego procesu i wynikowego kodu powrotu? Jak mogę uniknąć nieodłącznego wyścigu z pclose i zakończeniem rozpoczętego procesu?

Odpowiedz

3

rozwidlenia/exec/wait

popen tylko wrapper uproszczenie połączeń widelec/Exec. Jeśli chcesz uzyskać dane wyjściowe dziecka, musisz utworzyć potok, wywołać fork, zduplikować deskryptory plików potomnych do potoku, a następnie wykonać komendę exec. Rodzic może odczytać dane wyjściowe z potoku i zadzwonić czekać, aby uzyskać status wyjścia dziecka.

+4

Tak jak popen jest dostępny w oknach, które nie mają widelca, oczywiście nie zawsze jest to opakowanie. –

+0

Przepisałem mój kod, aby to zrobić (fork/exec/dup/etc.) I teraz otrzymuję sporadyczne niepowodzenia na waitpid (...) zwracającym -1/errno = ECHILD. Bzdury. – Joe

+3

Ok: Rozgryzłem to. Ten kod działa świetnie. Mój stary kod z popen/pclose działa świetnie. To, co NIE działa świetnie, to ukryta obsługa SIGCHLD, która została pochowana we wspólnym kodzie, który odziedziczyłem. OH SNAP. Zasadniczo byłem w wyścigu przeciwko temu handlerowi (który po prostu wywoływał waitpid (-1, ...). Lekcja: przeczytaj całą stronę podręcznika i nie zakładaj niczego! – Joe

1

Możesz użyć vfork() i execv().