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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как гарантировано закрыть файл, Вопрос к гуру 
:(
    Опции темы
Danissimo
Дата 6.12.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хочу, чтобы умирая (die или exit, или еще чего), программа из последних сил сбрасывала все файловые буферы. Как этого можно добиться.
PM MAIL   Вверх
Nab
Дата 6.12.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не буферизировать smile

Код

$| = 1;





--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 6.12.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я делаю так:

autoflush $fileHandle TRUE;

Но не помогает, кажется. То есть я не вижу строк в логе. Хотя должны быть. Кажется. Короче говоря, зуб не дам, но грешу именно на то, что файл без флэша закрывается.
PM MAIL   Вверх
DiverD
Дата 6.12.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



select FH; 
$| = 1;

или 

select((select(FH), $|=1)[0]);

или

my $fh = select(FH);
$|++;
select($fh);

а autoflush эта в ОО, а так такой ф-ции нет.

еще глянь perldoc IO::File


Это сообщение отредактировал(а) DiverD - 6.12.2006, 17:45
--------------------
[ FreeBSD & pERL p0WER eVERY dAY ]
PM MAIL   Вверх
Nab
Дата 6.12.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не знаю как работает autoflush, но принцип таков: Если были буфера в которых осталась инфа, то при умирании они по любому теряються... 
Может спасти немедленная запись на диск, то есть без буферизации. 
Или делать это отдельным процессом, который будет поддерживать буффер открытым, и при умирании процесса сам будет его сбрасывать. 
Конечно тут возможен вариант аварийного завершения самого следящего процесса. Но здесь можно сделать взаимное слежение, и при умирании одного из пары, второй чтоб сбрасывал общий буфер в обязательном порядке. 
Конечно одновременное умирание двух процессов тоже возможно, но вероятность такого действа намного меньше smile Ну кроме толстой кнопки Reset, уборщицы со шваброй, и бестолкового электрика smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 8.12.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я тоже в этом направлении думаю. Тока не знаю, как реализовать. Более того, думаю, что скорее всего можно повесить какой-нть обработчик смерти, который не препятствует ей, но в последний момент все-таки просто-напросто говорит

close $fileHandle.

Мельком я видел, что можно повесить обрабочик на die. Но из-за мизерного опыта у меня нету уверенности, достаточно ли такого обработчика. Кроме того, возможно, что существует более толковое решение, чем обработчик die. Вобщем, моя проблема в том, что бъем информации большой, а опыта и времени у меня мало.
PM MAIL   Вверх
Nab
Дата 8.12.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нет, при kill -9 обработчик не вызывается, это безоговорачная смерть smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 8.12.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ок. Если отказаться от внешних событий, приводящих к смерти, таких как kill -9 и швабра на рисете (вспомнилось: нет повести печальнее на свете, чем повесть о заклинившем рисете), то существует ли способ поймать момент, непосредственно перед самой смертью. Причем хочется поймать его после того, как все уже перестали писать в файл. В идеале -- последним. На практике -- после всех, кто может писать, но, возможно, перед теми, кто gracefully завершает перл.

Добавлено @ 11:43 
Хочу подчеркнуть, что автофлаш я уже включил. Но я почти (!)  уверен, что не все успевает записаться. То есть обработчик -- в дополнение к автофлашу, а не замена ему. Таким образом impact от kill -9 или заклинившего рисета минимизируется.
PM MAIL   Вверх
Nab
Дата 8.12.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Упс, ну так я подозреваю, все остальные состояния перл сам вполне корректно обрабатывает, и закрывает хендлы...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 8.12.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ок, в деталях.

Беру код. Много кода. Я знаю, какую он решает зачаду. Знаю общий принцип/алгоритм которым он ее решает. Но всех деталей не знаю. Например, я не знаю, а вешает ли он какие-нть подобные обработчики die.

Предположим, что вешает. Назовем, для определенности, этот самый обрабтчик именем А. Тогда мой обработчик (назовем его Б), закрывающий файл, должен выполняться после А, так как потенциально А может в процессе своего выполнения писать в файл. Как сделать так, чтобы мой Б выполнялся после всех возможных А?
PM MAIL   Вверх
Nab
Дата 8.12.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вызывать внутри себя обработчик А а потом самому доделывать все остальные действия, и умирать при необходимости smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 8.12.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ха, так кода-то много =) И я не знаю, существует этот А или нет. Я изхожу из того, что возможно существует. Другими словами я хочу так прстроить программу, чтобы она делала все возможное в любом случае.

Если А существует, то Б будет вызываться после всех А. Если нет, то о4хор. Хуже не будет. Вызовется Б и все. Вопрос тока в том, возможно ли как-нть сделать так, чтобы Б вызывался после возможных А, о существовании которых я ничего не знаю, или не возможно.

Если невозможно, то я буду искать другие пути. Если возможно, то как.
PM MAIL   Вверх
Nab
Дата 8.12.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



приблизительно вот так:
Код

# сохраняем предыдущее состояние обработчика 
our $pre_interrupt = $SIG{__DIE__};
# вешаем свое
$SIG{__DIE__} = \&my_interrupt;

sub my_interrupt {
   # вызываем предыдужее
    &$pre_interrupt(@_);
   # ну а здесь делаем свои делишки
    ....
   # в конце желательно вызвать стандартный код перла
   CORE::die(@_);
}




--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 8.12.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


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

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


 




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


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

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