Forum Webscript.Ru
		Программирование => Perl => Тема начата: frenky от 11 Января 2005, 19:08:58
		
			
			- 
				Вот функция блокировки 
 sub get_lock {
 open(SEM,  ">s.sem") ;
 flock(SEM,LOCK_EX) || "Cant block the file:$!";
 }
 sub relase_lock {close(SEM); }
 
 
 get_lock();
 dbmopen(%za,"kgames",0666) || die;
 
 get_lock();
 dbmopen(%zaz,"kgames1s",0666) || die;
 dbmclose(%za);
 relase_lock();
 
 dbmclose(%zaz);
 relase_lock();
 
 Тут заблокируються обе базы или одна и таже два раза?
- 
				ты совершенно неправильно делаешь
 perldoc -q lock
- 
				что то я так и не нашел там примера бля блокировок dbm файлов
			
- 
				frenky:
 Тут заблокируються обе базы или одна и таже два раза?
 
 ты при втором вызове get_lock(); не получишь блокировки, т.к. она уже включена, поэтому передавай какой-нибудь идент-р ф-ции блокировки, типа get_lock(\'kgames1s\');
 sub get_lock {
 my $name=shift||\'default\';
 open($name, ">$name.sem") ;
 flock($name,LOCK_EX) || "Cant block the file $name:$!";
 }
 sub relase_lock {
 $name=shift||\'default\';
 close($name);
 }
 
 
 frenky:
 что то я так и не нашел там примера бля блокировок dbm файлов
 
 да, с этим есть проблемы. Помнится есть модули для блокировки, почитай раздел Safe ways to lock a database вот тут:
 http://search.cpan.org/~pmqs/DB_File-1.810/DB_File.pm
- 
				Вот еще какая проблема на хостинге не установлен модуль DB_File.pm
			
- 
				frenky:
 на хостинге не установлен модуль DB_File.pm
 
 ну тогда юзай Any_DBM, хотя если собираешься делать что-то серьезное на DBM, то лучше бы обзавестись и если все совсем серьезно, работать не через DB_File, а через BerkeleyDB, т.к.  DB_File представляет лишь минимальную часть функция для работы с базами Berkeley (т.е. ни транзакций, ни блокировок)
- 
				ну а почему блокировка представленная віше не проконает?
			
- 
				Потому что ты не понимаешь что ты написал.
 Прокомментируй каждую строчку.
- 
				frenky:
 ну а почему блокировка представленная віше не проконает?
 
 сгодится, только нужно при блокировке к каждой БД добавить идентификатор. А то ты используешь один файл для блокировки всех БД, т.е. для каждой БД нужно использовать свой блокировочный файлGreen Kakadu:
 get_lock(\'kgames1s\');
 
 sub get_lock {
 my $name=shift||\'default\';
 open($name, ">$name.sem") ;
 flock($name,LOCK_EX) || "Cant block the file:$!";
 }
 
 sub relase_lock {
 $name=shift||\'default\';
 close($name);
 }
 
- 
				understood  
 thanks