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?
Tak jak popen jest dostępny w oknach, które nie mają widelca, oczywiście nie zawsze jest to opakowanie. –
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
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