Perlで「確実に閉じる」コード

http://codetter.com/?tag=umaemong 氏のから。

安全なファイル書き換えにはディレクトリも fsync すべき。だけど Perl でどう書くか – kazuhoのメモ置き場
http://d.hatena.ne.jp/kazuhooku/20100202/1265106190
Perl Hackers Hub:第6回 UNIXプログラミングの勘所(4)|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/perl-hackers-hub/000604

上記のを写経&動くように。or die の前のセミコロンいらないよね。

http://codetter.com/?tag=umaemong 氏のから。

安全なファイル書き換えにはディレクトリも fsync すべき。だけど Perl でどう書くか – kazuhoのメモ置き場
http://d.hatena.ne.jp/kazuhooku/20100202/1265106190
Perl Hackers Hub:第6回 UNIXプログラミングの勘所(4)|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/perl-hackers-hub/000604

上記のを写経&動くように。or die の前のセミコロンいらないよね。

  • タグ:
  • タグはありません
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl;
use IO::Handle;
my $fn = "test.txt";
my $newfn = "tmp.$$";
my $data = "test.$$";
open my $fh, '>', $newfn
or die "failed to open file:$newfn:$!";
print $fh $data;
IO::Handle::flush($fh)
or die "flush failed:$!";
IO::Handle::sync($fh)
or die "fsync failed:$!";
close $fh;
if (-f $fn) {
unlink "$fn~" if -f "$fn~";
link $fn, "$fn~"
or die "failed to link $fn to $fn~:$!";
}
rename $newfn, $fn
or die "failed to rename $newfn to $fn:$!";
sync_dir('.');
sub sync_dir {
my $dir = shift;
sysopen my $d, $dir, O_RDONLY
or die "failed to open directory:$dir:$!";
open my $d2, '>&', fileno($d)
or die "dup(2) failed:$!";
IO::Handle::sync($d2)
or die "fsync(2) failed:$!";
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX