|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Pavel Zheltouhov 2:5020/400 25 May 2000 20:10:35 To : All Subject : Re: open2 на ASPerl под Win32. Хотя бы объясните. -------------------------------------------------------------------------------- Alexander Semenov <sav@ulmen.mv.ru> wrote: > Это почти классический пример из О'Рейли. Все работает как надо. > (Кстати, все классические примеры из книжек работают как обещалось, > что наталкивает на мысль, что чего-то не понимаю я, а не > ASPerl/Win32). да оно всегда висло и глючило ситуация осложняется кривой реализацией консолей на win95/98 чуть что блокируются ВСЕ консольные приложения ! в nt чуть получше (там только одно) > В приведенном примере раскоментируем единственную закоментаренную > строчку - все виснет - но ГДЕ? Попробуйте угадать? Hа open3. Т.е. > скрипт > пишет '12' и замолкает навеки. Я понимаю, что cat не пишет в stderr, > но > заранее то этого никто знать не может. Почему на open3 ??? Я понимаю, > что в open3 что-то форкается, но приведите какой- нибудь > правдоподобный > алгоритм. на ASperl ничего не форкается обходятся другими вызовами вообще если делать все аккуратно то ничего не виснет главное не читать лишнего и не писать в прогу если она ничего не ожидает запускаемая программа тоже не должна буферизировать сложности возрастают если прога ошибки ложит в stderr и надо их читать тогда вообще фиг определишь чья сейчас очередь читать поэтому open2 и конвейерное открытие (я не смог,select не работает; еще идеи ? ) в общем случае,если прога не хочет выфлушивать свой вывод то никак ее не заставишь :( >Еще наблюдения: > - под отладчиком все идет до '12345678' т.е. виснет на чтении из > пустого stderr, отладчик делает $|=1 сделай и ты тоже (кстати работает,то есть в твоем скрипте зависает на счет 8 ) > что логично. > - под линуксом скрипт исполняется так: '12123456789AB', при этом > чтение > из пустого stderr просто возвращает undefined. Таким образом, > получается, > open3 исполняется дважды, а завершается успешно один раз? странно,может линуксовый cat закрывает stderr? > какие есть работающие методы этого? Пробовал через fork и Win32::Pipe, > но пайпы искажают информацию: в одну сторону строки кончаются > \x0D\x0D\x0A, в другую сторону пока не понял... binmode их не ест, > т.к., > к файлам Win32::Pipe не имеет никакого отношения... вообще форки на ASperl совсем недавно(только в 5.6 появились) All,как они работают? видно что через win32 threeds а как насчет блокировок с сокетами? я не разбирался но попробовал старые свои юниксовые проги зависает все равно что именно там блокируется ? -- Bye, Pavlo --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/5494c6e9dc27.html, оценка из 5, голосов 10
|