Задать вопрос

Неблокирующая запись в файл в Perl?

Есть код на perl работающий на Windows, который пишет данные в файл.

use warnings;
use feature 'say';

open(FH, '>', 'file.txt');
$i = 10;
while ($i > 0) {
	say FH $i;
	say $i;
	sleep 1;
	$i--;
}
close(FH)


Во время записи другая программа пытается открыть этот файл для чтения и валится с ошибкой "IO error 32 - The process cannot access the file because it is being used by another process."

Замена open на sysopen с добавлением атрибута O_NONBLOCK не работает.

use Fcntl qw(O_WRONLY O_CREAT O_APPEND O_NONBLOCK);

sysopen(FH, 'file.txt', O_WRONLY | O_CREAT | O_APPEND | O_NONBLOCK);


Ошибка:
Your vendor has not defined Fcntl macro O_NONBLOCK


Использвание sysopen без O_NONBLOCK ничего не даёт.

Windows 7, Strawberry Perl 5.16.3
  • Вопрос задан
  • 303 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@chorny_cpan
Написал программу читающую этот файл. Она читает этот файл без проблем.
use 5.12.0;use warnings;
use Fcntl qw(:flock);
open(FH, '<', 'file.txt') or die;
flock(FH, LOCK_EX|LOCK_NB) or die "Cannot lock - $! $^E\n";
while (<FH>) {
  print
}


Для того чтобы не работала буферизация при записи я добавил в вашу программу
FH->autoflush(1);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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