|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Serge Olkhowik 2:464/227.2 02 Jun 2003 13:02:15 To : All Subject : IO::Select на open3/Win32 -------------------------------------------------------------------------------- У кого-то субж работает? Под Win32 платформой мне нужно запустить суб-процесс (ещё один скрипт) и отлавливать его STDOUT и STDERR раздельно. Я нашёл пример гуглом и делаю таким способом: local *RUN; local *NUL; local *ERR = tempfile; my $pid = open3(\*NUL, \*RUN, ">&ERR", $run); while (<RUN>) { s/[\n\r]//g; gol '>> ' . $_ . "\n"; } close(NUL); close(RUN); waitpid $pid, 0; seek ERR, 0, 0; while (<ERR>) { s/[\n\r]//g; warn "** run: $_\n" } close(ERR); Hо хотелось бы отлавливать одновременно и ошибки, попробовал IO::Select: local *RUN; local *NUL; local *ERR; my $pid = open3(\*NUL, \*RUN, \*ERR, $run); my $sel = new IO::Select \*RUN, \*ERR; $sel->add(*RUN, *ERR); while (my @ready = $sel->can_read) { foreach my $fh (@ready) { # if ($fh == \*RUN) { if (fileno($fh) == fileno(RUN)) { gol "some info from RUN\n"; ($_ = <RUN>) =~ s/[\n\r]//g; gol '>> ' . $_ . "\n"; # } elsif ($fh == \*ERR) { } elsif (fileno($fh) == fileno(ERR)) { gol "some info from ERR\n"; ($_ = <RUN>) =~ s/[\n\r]//g; gol '** run: ' . $_ . "\n"; } else { warn "Unknown handle!\n"; } } } close(NUL); close(RUN); close(ERR); waitpid $pid, 0; Hо в таком коде происходит нечто странное - суб-процесс запускается, но до can_read даже не доходит :( Кто-то что-то знает по этому поводу? Спасибо! -- Serge Olkhowik (aka BaMba) hi@bamba.dp.ua http://www.bamba.dp.ua 2:464/227@fidonet ICQ:322855162 --- Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 * Origin: private news server (2:464/227.2@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/14694e87d98f2.html, оценка из 5, голосов 10
|