[Namazu-devel-ja 155] Re: フィルタ動作確認用スクリプト

Tadamasa Teranishi yw3t-trns @ asahi-net.or.jp
2004年 9月 12日 (日) 15:14:19 JST


寺西です。

Yukio USUDA wrote:
> 
> Tadamasa Teranishi wrote:
> > >
> > あるいは、ファイル名の方に プロセスID を入れるために util::tmpnam()
> > で、プロセスID をファイル名に付けるという方法もあります。
> > しかし、
> >
> これをするのであれば、
> util::tmpnam()で衝突しないものを作って返すようにして
> 多段フィルタでのテンポラリファイル名をフィルタ側で
> 作っている処理を減らしたいですね。

そもそも、
util::tmpnam() という名前が tmpnam(3) と同じネーミングなので、
util::tmpnam() は、微妙な仕様だとは思います。
# ユニークな名前を返してくれることをつい期待しますよね。

> ファイル名が 8.3 に収まっていないとまずいような DOS コマンドを
> 利用する場合も考えないといけなかったのではないかと思います。

であったり、拡張子は決められたものでないとダメなコマンドがあったり、
DOS の外部コマンドによる制限がいろいろと加わるので、なかなか
難しいところです。

PID を含むサブディレクトリを作成して、返すという方法もあるかと
思いますが、この場合は、サブディレクトリをいつ削除するのかと
いった別の問題が生じます。
また、外部コマンドによっては絶対パスのファイルを受け付けず、
ファイル名だけを受け付けるものもあったかと思いますので、
サブディレクトリへの移動を行わなければならないこともあるかも
しれません。

とか考えると、いろいろ修正を行わないといけなくなるので、難しい
ところですね。
最小限の修正となると $var::OUTPUT_DIR に PID を含むパスを
渡すのが楽ですね。(nmzcat, nmzmerge の場合は)

多段フィルタのテンポラリファイル名生成部分の処理は、nmzcat, nmzmerg
とは分けて考えて、これ用に別のサブルーチンを作っても良いのではないか
と思います。(今のところ、多段フィルタに使う外部ツールは、上記の制限
を受けないみたいですし。)

    my $tmpfile;
    my $uniqnumber = int(rand(10000));
    do {
        $tmpfile = util::tmpnam('NMZ.zip' . substr("000$uniqnumber",
-4));
        $uniqnumber++;
    } while (-f $tmpfile);

注意しないといけないのは、テンポラリファイル名の衝突チェックに -f を
使っている点で、テンポラリファイルを生成する前に複数テンポラリファイル
名を生成してしまうと、使用する際に衝突する可能性があることです。

-f の代わりに、実際に生成したテンポラリファイル名を記憶しておいて、
テンポラリファイルを使い終わった後は開放するといった手順が良いのかも
しれません。
# サブルーチン名は適当です。

#!/usr/bin/perl

my $tmp1 = newtmpnam('NMZ.zip');
print $tmp1 . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.tar') . "\n";
print newtmpnam('NMZ.tar') . "\n";

deletetmpnam('NMZ.zip', $tmp1);

print "--------\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.tar') . "\n";
print newtmpnam('NMZ.tar') . "\n";

deletealltmpnam('NMZ.zip');

print "--------\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.zip') . "\n";
print newtmpnam('NMZ.tar') . "\n";
print newtmpnam('NMZ.tar') . "\n";

my %tmpnam = ();

sub newtmpnam($)
{
    my ($basename) = @_;

    my $tmpfile;
    my $uniqnumber = int(rand(2));
    do {
        $tmpfile = tmpnam($basename . substr("000$uniqnumber", -4));
        $uniqnumber++;
    } while (-f $tmpfile || defined $tmpnam{$basename}{$tmpfile});
#    } while (-f $tmpfile);

    $tmpnam{$basename}{$tmpfile} = 1;

    return $tmpfile;
}

sub deletetmpnam($$)
{
    my ($basename, $tmpfile) = @_;

    return 'not found.' unless(defined $tmpnam{$basename});

    if (defined $tmpnam{$basename}{$tmpfile}) {
        delete $tmpnam{$basename}{$tmpfile};
    } else {
        return 'not found.';
    }

    return undef;
}

sub deletealltmpnam($)
{
    my ($basename) = @_;

    return 'not found.' unless(defined $tmpnam{$basename});

    foreach my $tmpfile (keys %{ $tmpnam{$basename} }) {
        delete $tmpnam{$basename}{$tmpfile};
    }

    return undef;
}
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E




Namazu-devel-ja メーリングリストの案内