|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Artem Chuprina 2:5020/371.32 22 Jan 2001 13:06:46 To : Mike Subject : Re: flock -------------------------------------------------------------------------------- В твоём письме от Thu, 18 Jan 2001 23:45:51 +0300 написано: mvr> Меня гложут смутные сомнения... Вот сделал я нечто подобное для mvr> перезаписи файлов с созданием бэкапа, а теперь сумлеваюсь. mvr> Вопрос ниже. mvr> $new = IO::File->new("$filename.n", "a+"); mvr> $new->flock(LOCK_EX | LOCK_NB) or die $!; mvr> $old = IO::File->new($filename, "r"); mvr> $old->flock(LOCK_EX | LOCK_NB) or die $!; mvr> $new->seek(0,0); mvr> $new->truncate; mvr> $new->print(......); mvr> $new->flush; mvr> rename $filename, "$filename.b" or die $!; mvr> rename "$filename.n", $filename or die $!; mvr> $old->close; mvr> $new->close; mvr> Ежели где синтаксис неправильный или метод отсутствует, нижайше mvr> прошу простить, оно только для объяснения принципа. Естественно, mvr> весь этот бред сидит внутри eval. mvr> ВHИМАHИЕ, ВОПРОС! mvr> Где в такой схеме может подкрасться враг? Я имею в виду, в какой mvr> строчке чужой процесс может вклиниться и нагадить? Во-первых, возможен крэш процесса или системы между двумя rename с потерей файла. Если уж на то пошло, то первый rename должен называться link. Во-вторых, возможна ситуация, когда первая строка выполняется перед последним rename параллельного процесса, а вторая - после close параллельного процесса. В результате ты имеешь один файл в $old и $new. Потеря файла. Может, еще дыры есть, я сейчас торможу. Hо тебе пока хватит :-) -- Artem Chuprina E-mail: ran@ran.pp.ru Programmer FIDO: 2:5020/371.32 Memonet Ltd. Phone: +7-095-284-1356 --- slrn/0.9.6.3-as (Linux) * Origin: AKA с подствольным плюсомётом (2:5020/371.32) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/7171143b679e2.html, оценка из 5, голосов 10
|