0

ファイルの内容を監視するコードを書いています。プログラムがファイルの最後に到達したら、きれいに終了させたいです。

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_lineEnd_of_filehandler

4

1 に答える 1