tmpfileについて調べたこと

Linuxにおいて大体何かを組んでいると一時的に何かに保存したいとかメモリ食べたくないとか様々な理由で一時的なファイルを作成すると思います。一時的なファイルを作成すること自体はそこまで難しくなく/tmp/以下に好きな前をつけて扱えばいいと思うのですが、好きに/tmp以下にファイルを作るのは複数プロセスが立ち上がった場合に同一ファイルを意図せず見てしまう、他のプログラムが同一の名前を意図せず使用してしまう、セキュリティホールなどになってしまう(see man tempnam)などの危険性があります。頑張ればこれらの問題はファイルオープン時におけるオプションのO_EXCL(see man open)とファイル名生成の工夫で大体は解決つくはずですが、これを頑張らなくてやってくれる仕組みがtmpfileです。読み書き用で開いてO_EXCLで他のプロセスが同じ名前で開くことを防ぎます。おまけにオープン直後にunlink実行してて削除してくれるので後始末も安心です。(/tmp以下は大体の場合はtmpwatchというcronによって良きに削除されていくのでそこまで問題にはならないですが)各言語にもtmpfile相当のものが実装されていて似たような挙動をするはず。

例を取ってPerlだとFile::Tempというモジュールがありまして。

tempfileの実行テスト

use strict;
use warnings;
use File::Temp qw/ tempfile /;

my ($fh,$filename) = tempfile( UNLINK => 1);

print $filename . "\n";

実行結果

/tmp/T4Yk7WE06m

確認すると削除されています。

デフォルトの挙動でファイルが残るので
UNLINK => 1 をtempfileのオプションとして残すと削除されました。

同様な処理として一時的なディレクトリを作成する処理としてtempdirというものがあるのですが、LinuxProgrammingInterfaceにはこの用語出てこないです。代わりにmkdtempというCライブラリの話が出てくるのでこちらがあたるのでしょうね。