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:$!";
}