ファイルの内容を監視するコードを書いています。プログラムがファイルの最後に到達したら、きれいに終了させたいです。
let log () : input_channel Lwt.t =
openfile "log" [O_RDONLY] 0 >>= fun fd ->
Lwt.return (of_fd input fd);;
let rec loop (ic: input_channel) = Lwt_io.read_line ic >>= fun text ->
Lwt_io.printl text >>= fun _ -> loop ic;;
let monitor () : unit Lwt.t = log () >>= loop;;
let handler : exn -> unit Lwt.t = fun e -> match e with
| End_of_file -> let (p: unit Lwt.t), r = Lwt.wait() in p
| x -> Lwt.fail x;;
let main () : unit Lwt.t = Lwt.catch monitor handler;;
let _ = Lwt_main.run (main ());;
ただし、ファイルを読み取って最後に到達すると、プログラムは終了せず、ハングするだけで、Ctrl + c でエスケープする必要があります。bind の内部で何が起こっているのかはわかりませんが、それが何をしていても、最終的Lwt_io.readline ic
にはファイルの最後にEnd_of_file
到達して例外を返す必要があると考えました。これはおそらくハンドラーなどに渡されます。
解決策を推測する必要がある場合は、定義の最後のバインドにチェック>>=
を含めると思います。しかし、 が返されたif
かどうかを確認していると思いますが、これは.Lwt_io.read_line
End_of_file
handler