Как я блокирую файл в Perl?

Поскольку ваш файл webpack.config.js уже находится в папке /app, не должен быть псевдоним:

resolve: {
   alias: {
       styles: path.join(__dirname, 'styles') 
   }
}

?

28
задан brian d foy 23 October 2008 в 01:58
поделиться

10 ответов

Если Вы заканчиваете тем, что использовали скопление, вот некоторый код, чтобы сделать это:

use Fcntl ':flock'; # Import LOCK_* constants

# We will use this file path in error messages and function calls.
# Don't type it out more than once in your code.  Use a variable.
my $file = '/path/to/some/file';

# Open the file for appending.  Note the file path is quoted
# in the error message.  This helps debug situations where you
# have a stray space at the start or end of the path.
open(my $fh, '>>', $file) or die "Could not open '$file' - $!";

# Get exclusive lock (will block until it does)
flock($fh, LOCK_EX) or die "Could not lock '$file' - $!";

# Do something with the file here...

# Do NOT use flock() to unlock the file if you wrote to the
# file in the "do something" section above.  This could create
# a race condition.  The close() call below will unlock the
# file for you, but only after writing any buffered data.

# In a world of buffered i/o, some or all of your data may not 
# be written until close() completes.  Always, always, ALWAYS 
# check the return value of close() if you wrote to the file!
close($fh) or die "Could not write '$file' - $!";

Некоторые полезные ссылки:

В ответ на Ваш добавленный вопрос, я сказал бы или поместить блокировку в файл или создать файл, что Вы называете 'блокировку' каждый раз, когда файл заблокирован, и удалите его, когда это больше не блокируется (и затем удостоверьтесь, что Ваши программы повинуются тем семантика).

30
ответ дан John Siracusa 14 October 2019 в 10:15
поделиться

CPAN к спасению: IO:: LockedFile.

7
ответ дан Gary Richardson 14 October 2019 в 10:15
поделиться

Ryan P записал:

В этом случае файл на самом деле разблокирован в течение короткого периода времени, в то время как файл вновь открыт.

, Таким образом, don’t делают это. Вместо этого open файл для чтения-записи:

open my $fh, '+<', 'test.dat'
    or die "Couldn’t open test.dat: $!\n";

, Когда Вы готовы записать счетчик, всего seek назад к запуску файла. Обратите внимание, что, если Вы делаете это, Вы должны truncate незадолго до close, так, чтобы файл isn’t уехал с запаздывающим мусором, если его новое содержание короче, чем его предыдущие. (Обычно, текущая позиция в файле в его конце, таким образом, можно просто записать truncate $fh, tell $fh.)

кроме того, обратите внимание, что я использовал с тремя аргументами open и лексический дескриптор файла, и я также проверил успех операции. Избегайте глобальных дескрипторов файлов (глобальные переменные плохи, mmkay?) и волшебство, с двумя аргументами open (который был источником многих (n годный для использования) ошибка в коде Perl), и всегда, тестируют, успешно выполняются ли Ваш open с.

6
ответ дан Aristotle Pagaltzis 14 October 2019 в 10:15
поделиться

Я думаю, что было бы намного лучше показать это с лексическими переменными как обработчики файлов и обработка ошибок. Также лучше использовать константы от модуля Fcntl, чем твердый код магическое число 2, который не мог бы быть правильным числом во всех операционных системах.

    use Fcntl ':flock'; # import LOCK_* constants

    # open the file for appending
    open (my $fh, '>>', 'test.dat') or die $!;

    # try to lock the file exclusively, will wait till you get the lock
    flock($fh, LOCK_EX);

    # do something with the file here (print to it in our case)

    # actually you should not unlock the file
    # close the file will unlock it
    close($fh) or warn "Could not close file $!";

Выезд полное документация скопления и учебное руководство по Захвату файла на PerlMonks даже при том, что это также использует старый стиль использования дескриптора файла.

На самом деле я обычно пропускаю обработку ошибок на завершении (), поскольку нет очень, я могу сделать, если это перестало работать так или иначе.

Относительно того, что заблокировать, если Вы работаете в единственном файле тогда, блокируют тот файл. Если необходимо заблокировать несколько файлов сразу тогда - для предотвращения тупиков - лучше выбрать один файл, который Вы блокируете. Действительно не имеет значения, является ли это одним из этих нескольких файлов, действительно необходимо заблокировать или отдельный файл, который Вы создаете только для цели блокировки.

5
ответ дан szabgab 14 October 2019 в 10:15
поделиться

Имейте Вас, рассмотрел использование LockFile:: Простой модуль ? Это уже делает большую часть работы для Вас.

В моем прошлом опыте, я нашел его очень простым в использовании и крепким.

4
ответ дан Swaroop C H 14 October 2019 в 10:15
поделиться
use strict;

use Fcntl ':flock'; # Import LOCK_* constants

# We will use this file path in error messages and function calls.
# Don't type it out more than once in your code.  Use a variable.
my $file = '/path/to/some/file';

# Open the file for appending.  Note the file path is in quoted
# in the error message.  This helps debug situations where you
# have a stray space at the start or end of the path.
open(my $fh, '>>', $file) or die "Could not open '$file' - $!";

# Get exclusive lock (will block until it does)
flock($fh, LOCK_EX);


# Do something with the file here...


# Do NOT use flock() to unlock the file if you wrote to the
# file in the "do something" section above.  This could create
# a race condition.  The close() call below will unlock it
# for you, but only after writing any buffered data.

# In a world of buffered i/o, some or all of your data will not 
# be written until close() completes.  Always, always, ALWAYS 
# check the return value on close()!
close($fh) or die "Could not write '$file' - $!";
3
ответ дан John Siracusa 14 October 2019 в 10:15
поделиться

Моя цель в этом вопросе состояла в том, чтобы заблокировать файл, используемый в качестве хранилища данных для нескольких сценариев. В конце я привык подобный код для следующего (от Chris):

open (FILE, '>>', test.dat') ; # open the file 
flock FILE, 2; # try to lock the file 
# do something with the file here 
close(FILE); # close the file

В его примере я удалил ФАЙЛ скопления, 8, поскольку близкое (ФАЙЛ) выполняет это действие также. Настоящая проблема состояла в том, когда сценарий запускается, это должно содержать текущий счетчик, и когда это заканчивается, это должно обновить счетчик. Это - то, где Perl имеет проблему, для чтения файла Вы:

 open (FILE, '<', test.dat');
 flock FILE, 2;

Теперь я хочу выписать результаты и так как я хочу перезаписать файл, который я должен вновь открыть и усечь который результаты в следующем:

 open (FILE, '>', test.dat'); #single arrow truncates double appends
 flock FILE, 2;

В этом случае файл на самом деле разблокирован в течение короткого периода времени, в то время как файл вновь открыт. Это демонстрирует случай для внешнего файла блокировки. Если Вы собираетесь быть изменяющимися контекстами файла, используйте файл блокировки. Измененный код:

open (LOCK_FILE, '<', test.dat.lock') or die "Could not obtain lock";
flock LOCK_FILE, 2;
open (FILE, '<', test.dat') or die "Could not open file";
# read file
# ...
open (FILE, '>', test.dat') or die "Could not reopen file";
#write file
close (FILE);
close (LOCK_FILE);
1
ответ дан Ryan P 14 October 2019 в 10:15
поделиться

Используйте скопление Luke.

Редактирование: Это является хорошим объяснением.

0
ответ дан mk. 14 October 2019 в 10:15
поделиться

скопление создает блокировки файла стиля Unix и доступно на Perl большей части ОС, работает. Однако блокировки скопления являются консультацией только.

редактирование: подчеркнутый, что скопление портативно

0
ответ дан Michael Ratanapintha 14 October 2019 в 10:15
поделиться

Вот мое решение для чтения и записи за одну блокировку ...

open (TST,"+< readwrite_test.txt") or die "Cannot open file\n$!";
flock(TST, LOCK_EX);
# Read the file:
@LINES=<TST>;
# Wipe the file:
seek(TST, 0, 0); truncate(TST, 0);
# Do something with the contents here:
push @LINES,"grappig, he!\n";
$LINES[3]="Gekke henkie!\n";
# Write the file:
foreach $l (@LINES)
{
   print TST $l;
}
close(TST) or die "Cannot close file\n$!";
0
ответ дан 28 November 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: