- tempfile(...)が作成したテンポラリファイルは、環境によってはflockされていることがある
- tempfile(CLEANUP => 1)は、テンポラリファイルへの参照をretainする
- つまり、CLEANUPを指定している場合、参照カウントに頼った自動closeは機能しないので、明示的にcloseする必要がある
- また、明示的にcloseしないとflock可能にならない場合がある
■ログ
16:23:30 <kazuho_> あれ perl って file handle への refcnt がゼロになったら自動的に close してくれますよね 16:23:43 <tokuhirom> してくれますね 16:23:48 <tokuhirom> しなきゃおかしいw 16:32:33 <kazuho_> https://gist.github.com/kazuho/11168660 16:32:37 <kazuho_> こういうことだった 16:32:53 <tokuhirom> あー。それな。 16:33:01 <tokuhirom> なんか File::Temp さんごちゃごちゃやってんすよね 16:42:37 <kazuho_> linux で perl -MFile::Temp=tempfile -e '(undef, my $fn) = tempfile(UNLINK => 1); sleep 100' 16:42:47 <kazuho_> ってやっても、テンポラリファイルが開きっぱになるなー 16:49:41 <kazuho_> _deferred_unlink って関数が $fh にぎにぎしちゃうのかー > File::Temp 16:50:50 <tokuhirom> UNLINK => 1 するとなかなか UNLINK されなくなるの、だいぶアレゲですねw 16:51:16 <kazuho_> というより、 16:51:22 <kazuho_> > # close the filehandle without checking its state 16:51:23 <kazuho_> > # in order to make real sure that this is closed 16:51:30 <kazuho_> という理由で $fh をにぎりっぱにしてるから 16:51:38 <kazuho_> refcnt 減らしても自動でcloseされない 16:52:13 <tokuhirom> なんか UNLINK => 0 してやり過ごすってのを昔見た気がした 16:52:27 <kazuho_> そしたら自動削除してくれないじゃんw 16:52:33 <kazuho_> 明示的にcloseするわ… 16:53:03 <kazuho_> Starlet で select を、テンポラリファイルの flock で囲おうとしてるんだけど 16:53:15 <kazuho_> osx だと tempfile が EXLOCK 指定する 16:53:23 <kazuho_> → UNLINK してるとファイル開いたままになる 16:53:28 <kazuho_> → ロックできない!!! 16:53:34 <kazuho_> という問題なので 16:54:01 <tokuhirom> 明示的にクローズが正解かー 16:54:07 <kazuho_> ですね 16:54:09 <kazuho_> まあ、UNLINK => 1 してるとファイル開きっぱになるの、バグだと思うけどなー 16:54:15 <kazuho_> file descriptorたりなくなるじゃん!! 16:54:52 <kazuho_> まあそういう場合は tempdir してその中に手動でファイル作ろうね、なんだろうな 16:54:53 <tokuhirom> なんかでもそこ今更変えられなさそうw 16:54:57 <kazuho_> 変えようがないでしょうね 16:54:58 <tokuhirom> a- 16:55:40 <kazuho_> あざますあざます