![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| scion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 13.5.2009 Репутация: нет Всего: нет |
история такова, раньше немного писал на си. сейчас нужно на пеле написать задание.
Написать то я написал, но со стороны программиста на pel'е это наверное смотрится ужасно... нужно помочь сделать код который не стыдно будет показать. =) спасибо большое. всем. Или может так нормально? задание: 1. Реализовать набор функций для работы с временными файлами. Первая функция должна создавать временный файл и сохранять его имя в указанной переменной, вторая удалять его. Временные файлы должны удаляться даже если выполнение скрипта завершено принудительно или в результате ошибки. Если файл был создан, но не удален, то в конце работы скрипта должно выводится предупреждение собственно то код: #!/usr/bin/perl $SIG{INT} = \&int_sig; sub int_sig { $SIG{INT} = \&int_sig; print "Получен сигнал INT по нажатию Ctrl+C\n"; print "Заканчиваю работу!\n"; exit; } # рождает tmp файлы sub CrTempFile { $num++; use File::Temp qw/ :POSIX /; my $file = tmpnam(); my $fh = tmpfile(); ($fh, $file) = tmpnam(); print "created file: ", $file,"\n"; $OpenFile[$num]=$file; return $file; } # удаляет темп файлы sub DelTempFile { foreach $_ (@_) { print "deleted: ",$_,"\n"; unlink($_) or die "Couldn't unlink $file : $!"; $i=1; ######### вот это место точно надо рег. выражениями порешить... а то для перла это страшно... while ($i<=$num) { if ($OpenFile[$i] eq $_) { $OpenFile[$i]=0; } $i++; } } } # тестируем создаём 5файлов. удаляем 3. остальные удаляются при ^C. $file=CrTempFile(); $file2=CrTempFile(); $file3=CrTempFile(); $file4=CrTempFile(); $file5=CrTempFile(); DelTempFile($file); DelTempFile($file2); DelTempFile($file4); while (1) {print "Работаю ...\n"; sleep 1;}; END { for ($i=1;$i<=$num;$i++){ if ($OpenFile[$i] eq 0) { next; } print $OpenFile[$i],"\n"; unlink($OpenFile[$i]) or die "Couldn't unlink $file : $!"; # print "OK"; } } |
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Зачем вы два раза ставите один обработчик на один сигнал? Достаточно один раз это сделать в начале скрипта. И вот здесь непонятно зачем два раза... Прогоните программу через perlcritic, он вам покажет самые грубые ошибки -------------------- Died at Life.pl line 21 |
|||
|
||||
| scion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 13.5.2009 Репутация: нет Всего: нет |
спасибо. один $SIG{INT} убрал. это my $file = tmpnam(); my $fh = tmpfile(); ($fh, $file) = tmpnam() заменил на просто my ($fh, $file) = tmpnam(); вкуриваю в ман perlcritic... |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Я бы заменил массив @OpenFile хэш %OpenFile. Тогда
В sub CrTempFile $OpenFile{$file} = 1; (и счетчик не нужен) В sub DelTempFile цикл while можно заменить на $OpenFile{$_} = 0; (и счетчик не нужен) В блоке END достаточно будет что-то вроде unlink grep {$OpenFile{$_}} keys %OpenFile; |
|||
|
||||
| scion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 13.5.2009 Репутация: нет Всего: нет |
конструктивно. спасибо. сейчас займусь. |
|||
|
||||
| ramus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 21.2.2008 Репутация: 1 Всего: 1 |
Не знаю как в винде, но на юниксе гарантированный способ - открыть файл и тут же, не закрывая его, удалить этот файл. Пока файл открыт в приложении он будет ему доступен. Никакой другой процесс доступ к Вашему временному файлу не сможет получить. Причем даже если другое, параллельно выполняемое приложение (попытка инъекции) попытается открыть/создать файл с точно таким же именем, то это будет другой файл (с другим i-node). Как только Ваше приложение закроет свой временный файл он автоматически удалится операционной системой и занимаемое им место вернется в файловую систему... Кстати: - Секция END не отработается при kill -9 - Примененный механизм сигналов и обработчиков тоже имеет слабое место - Вы можете впоследствии переопределить в своей программе этот обработчик явно или неявно при использовании внешних модулей, например при работе c БД (DBD::Oracle). |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |