私の第一印象はreadFile
、その利便性と、ファイル記述子を必要以上に長く開いたままにしておく可能性との間のトレードオフであり、それらを閉じる方法がありませんでした。実験として、私は次の (非常に実用的な) プログラムを試してみました。
main = do
mapM_ (\idx -> readIt) [1..1000]
where readIt = do
contents <- readFile "/etc/passwd"
putChar $ head contents
しかし、実際には、ファイル記述子を再利用するという非常に優れた仕事をしています。カウントが約 70 を超えることはありません。
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 4
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 5
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 6
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 7
...
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 65
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 66
close(3) = 0
close(4) = 0
close(5) = 0
...
close(54) = 0
close(55) = 0
close(56) = 0
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 3
open("/etc/passwd", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 4
これはどのように起こっていますか?の値がcontents
GC され、参照されなくなったファイル記述子が含まれているだけですか? または、ファイル記述子リソースを管理するための別のメカニズムはありますか? メカニズムが何であれ、かなりうまく機能しているようhClose
です。