Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не буффиризированный вывод 
V
    Опции темы
BurnerCode
Дата 16.4.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.2.2008
Где: Беларусь

Репутация: нет
Всего: нет



Хочу понять почему в данном сценарии по разному работаю операторы print с отключенной буфферизацией и syswrite который по дефолту не использует буфферизированый вывод.

Код

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes('sleep');

$|++;

open(FH, "< domains") or die "$!";
open(KNIFE, "| ./knife.pl") or die "$!";
while(<FH>)
{
    sleep(0.1);
    chomp;
    #syswrite KNIFE, "http://$_ 127.0.0.1 root GET\n"
    #print KNIFE "http://$_ 127.0.0.1 root GET\n"
}
close KNIFE;
close FH;


- если исп. print то такое впечатление что вывод серано буфферизируемый, т.к. проходит какоето вреия и сразу список вываливается. Хочу сказать что в этом случаи у меня нет разницы если я исп $|++ или обхажусь без него.
- syswrite работает нормально, как толька поступают байты он сразу в дискриптор


Это сообщение отредактировал(а) BurnerCode - 16.4.2008, 12:09
PM MAIL   Вверх
KSURi
Дата 16.4.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



А в чем собственно разница?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
amg
Дата 16.4.2008, 12:53 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(BurnerCode @  16.4.2008,  09:56 Найти цитируемый пост)
Хочу понять почему в данном сценарии по разному работаю операторы print с отключенной буфферизацией и syswrite который по дефолту не использует буфферизированый вывод
Дело в том, что $|++ отключает буферизацию не "вообще", а только для умолчаемого канала вывода. Это STDOUT, пока не выбран другой. А KNIFE умолчаемым выбран не был. Поэтому вывод на него через print остается буферизованным.

Решение: заменить строку $|++; на одну из следующих:
Код

# Сделать умолчаем KNIFE и отключить для него буферизацию. 
# После этого можно просто print вместо print KNIFE
select KNIFE; $|++;

# Отключить буферизацию для KNIFE и восстановить статус кво.
# Это работает, т.к. для каждого FH - своя $|
my $oldfh = select KNIFE; $|++; select $oldfh;


PM MAIL   Вверх
BurnerCode
Дата 16.4.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 28.2.2008
Где: Беларусь

Репутация: нет
Всего: нет



Блин точн, забыл совсем про select =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.