Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [ 88 ] 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

my Spathname = shift; my Snaptime = shift 11 0; my Slockname = name21ock($pathname); my Swhosegot = "Slockname/owner"; mv Sstart = timeO:

my Sstart = time();

use strict;

use File::LockDir;

$SIG{INT} = sub { die "outta here\n" }; $File::LockDir::Debug = 1;

my Spath = shift or die "usage: $0 <path>\n";

unless (nflock($path, 2)) {

die "couldnt lock Spath in 2 seconds\n";

sleep 100; nunflock($path);

Исходный текст модуля приведен в примере 7.10. За дополнительными сведениями о построении модулей обращайтесь к главе 12 «Пакеты, библиотеки и модули».

Пример 7.10. File::LockDir

package File::LockOir;

# Модуль, обеспечивающий простейшую блокировку

# на уровне имен файлов без применения хитрых системных функций.

# Теоретически информация о каталогах синхронизируется в NFS.

# Стрессовое тестирование не проводилось.

use strict; use Exporter;

use vars qw(@ISA ©EXPORT); @ISA = qw(Exporter); ©EXPORT = qw(nflock nunflock);

use vars qw($Debug SCheck);

SDebug = 0; # Может определяться заранее

SCheck 11= 5; # Может определяться заранее

use Cwd;

use Fcntl;

use Sys::Hostname;

use File.:Basename;

use File::stat;

use Carp;

my %Locked Files = ();

# Применение: nflock(0A{1/l; ТАЙМАУГ) sub nflock(S;$) {



ту Smissed = 0; local .OWNER;

# Если блокировка уже установлена, вернуться if ($Locked Files{$pathname!) {

carp "Spathname already locked";

return 1

if (,-w dirname($pathname)) {

croak "cant write to directory of Spathname";

while (1) {

last if mkdir($lockname, 0777); confess "cant get Slockname: $!" if $missed++ > 10 && •-d Slockname;

If (SDebug) {{

open(0WNER, "< Swhosegot") last; # exit "if"!

my Slockee = <OWNER>;

chomp(Slockee);

printf STDERR "%s $0\[$$]: lock on %s held by %s\n",

scalar(localtime), Spathname, Slockee; close OWNER;

sleep SCheck;

return if Snaptime && time > Sstart+Snaptime;

sysopen(0WNER, Swhosegot, 0 WRONLY0 CREAT0 EXCL)

or croak "cant create Swhosegot: printf OWNER "SO\[S$] on %s since %s\n",

hostnameO, scalar(localtime); close(OWNER)

or croak "close Swhosegot: S!"; $Locked Files{$pathname)++; return 1;

# Освободить заблокированный файл sub nunflock($) {

my Spathname = shift;

my Slockname = name21oGk($pathname);

my Swhosegot = "Slockname/owner";

unlink(Swhosegot);

carp "releasing lock on Slockname" if SDebug; delete $Locked Files{Spathname}; return rmdir($lockname);

# Вспомогательная функция



sub name21ock($) {

my $pathname = shift;

my $dir = dirname($pathname);

my $file = basename($pathname);

$dir = getcwdO if $dir eq .;

my Slockname = "Sdir/Sfile.LOCKOIR";

return llockname;

# Ничего не забыли END {

for my Spathname (keys %Locked Files) { my Slockname = name21ock($pathnarae); my Swhosegot = "Slockname/owner"; carp "releasing forgotten Slockname", unlink($whosegot); return rmdir($lockname);

7.22. Программа: lockarea

Функция Perl flock блокирует только целые файлы, но не отдельные их области. Хотя fcntl поддерживает частичную блокировку файлов, из Perl с ней работать трудно - в основном из-за отсутствия модуля XS, который бы обеспечивал переносимую упаковку необходимой структуры данных.

Программа из примера 7.11 реализует fcntl, но лишь для трех конкретных архитектур: SunOS, BSD и Linux. Если вы работаете в другой системе, придется узнать формат структуры flock. Для этого мы просмотрели заголовочный файл С sys/ fcntl.h и запустили программу c2ph, чтобы получить информацию о выравнивании и типах. Эта программа, распространяемая с Perl, работает только в системах с сильным влиянием Беркли (как те, что перечислены выше). Вы не обязаны использовать c2ph, но эта программа несомненно облегчит ваше существование.

Функция struct flock в программе lockarea выполняет упаковку и распаковку структуры, руководствуясь переменной $"0 с именем операционной системы. Объявления функции struct flock не существует, мы просто создаем синоним для версии, относящейся к конкретной архитектуре. Синонимы функций рассматриваются в рецепте 10.14.

Программа lockarea открывает временный файл, уничтожая его текущее содержимое, и записывает в него полный экран (80x23) пробелов. Все строки имеют одинаковую длину.

Затем программа создает производные процессы и предоставляет им возмок-ность одновременного обновления файла. Первый аргумент, N, определяет количество порождаемых процессов (2*.N). Следовательно, lockarea 1 порождает два процесса, lockarea 2 - четыре, lockarea 3 - восемь, lockarea 4 - шестнадцать



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [ 88 ] 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242