Piszę program, który przekazuje wiele procesów potomnych i chciałbym, aby wszystkie te procesy potomne były w stanie pisać linie do STDERR
i STDOUT
bez wynik jest zniekształcony. Nie robię nic nadzwyczajnego, tylko emituję linie kończące się nową linią (co, przynajmniej w moim rozumieniu, byłoby operacją atomową dla Linuksa). Z Perlfaqa jest napisane:fork() i STDOUT/STDERR na konsolę z procesów potomnych
Zarówno proces główny, jak i obiekt w tle (proces "potomny") mają te same uchwyty plików STDIN, STDOUT i STDERR. Jeśli obaj spróbują uzyskać do nich dostęp od razu, mogą się zdarzyć dziwne rzeczy. Możesz je zamknąć lub ponownie otworzyć dla dziecka. Możesz obejść to, otwierając potok (patrz otwarte), ale w niektórych systemach oznacza to, że proces potomny nie może przeżyć nadrzędnego.
Mówi, że powinienem "zamknąć lub ponownie otworzyć" te uchwyty plików dla dziecka. Zamknięcie jest proste, ale co oznacza "ponowne otwarcie"? Próbowałem coś takiego od wewnątrz moich procesów potomnych i nie działa (wyjście nadal pobiera zniekształcone):
open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!";
close(STDERR);
# re-open STDERR
open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!";
Więc, co robię źle z tym? Jak mógłby wyglądać przykład rury? Czy istnieje lepszy sposób skoordynowania danych wyjściowych z wielu procesów na konsoli?
Skończyłem z IO :: Pipe i AnyEvent dla rur i wyboru IO, ale to wydaje się działać. Dzięki – mpeters