開いたファイルの後始末

erl -man file より引用:

IoDevice is really the pid of the process which handles the file. This process is linked to the process which originally opened the file. If any process to which the IoDevice is linked terminates, the file will be closed and the process itself will be terminated. An IoDevice returned from this call can be used as an argument to the IO functions (see io(3)).

IoDevice の実体はファイルを操作するプロセスの Pid であり、ファイルを open したプロセスとリンクされている。そしてそのプロセスが終了したとき、ファイルが自動的に close されるようになっている。サーバを書く上では実に頼もしい仕様だ。

ところで file:open/2 で指定できるオプションには raw というものがある。同じく erl -man file によれば、このオプションを指定するとアクセスが高速化される反面、次のような制限が加わる:

  • io モジュールの関数を使えなくなる
  • ファイルを open したプロセスからしかアクセスできなくなる
  • リモートErlangファイルサーバ(これが何なのかよく分からないが)を使用することができなくなる

「ファイルを open したプロセスが終了しても、自動的にファイルが閉じられなくなる」とは書いていないから、冒頭に引用した部分の説明は raw オプションを指定した場合でも基本的に有効、と判断して良いのだろうか。

erlシェルで見る限り、raw を指定した場合の IoDevice の実体はポート+αらしい。ポートもまた Erlang が提供する抽象のひとつだから、やはりプロセス終了時には自動的に後片づけしてくれる、と思いたくなる。

erl> {ok, Io2} = file:open("m1.erl", [read, raw]).
{ok,{file_descriptor,prim_file,{#Port<0.420>,9}}}

実際もし自動的にファイルが close されないとなると、この IoDevice にアクセスできるのは open した当のプロセスだけなのだから、実質的に close する手段が無くなってしまう。

One Response

  1. [...] へびにっき 樹上で暮らすヘビのように生きたい « 開いたファイルの後始末 [...]

Leave a Reply