Странное поведение OCaml flush (выход из всех потоков)

#sockets #ocaml #channel

#сокеты #ocaml #канал

Вопрос:

Я пытаюсь реализовать CLI с помощью 2 команд:

  • run это порождает сокет unix /my/path/file.sock и выдает вывод
  • watch который подключается к сокету и перенаправляет вывод на свой собственный вывод

Когда я завершаю выполнение watch команды, я не могу понять, почему run команда также завершается. Они не вызывают никаких исключений или системных сигналов. Я заметил, что проблемы возникают из-за flush функции. После вызова он действует как exit 0 . Как же так?

введите описание изображения здесь

Вот источники: https://github.com/soywod/comodoro

Ответ №1:

Сервер должен прослушивать отключение клиента и удалять соединение из списка соединений. Что-то вроде этого может сработать:

 let client_thread conn =
  let in_ch = in_channel_of_descr conn in
  while true do
    try input_line in_ch |> ignore
    with End_of_file ->
     (* Remove conn from !conn and close the conn *)
  done
in

let add_conn () =
  (* ... *)
  Thread.create client_thread conn |> ignore;
  (* ... *)
in
 

Комментарии:

1. Действительно, я не хотел слушать канал in, потому что мне это не нужно, но на самом деле обязательно знать, когда клиент отключается. Теперь работает как шарм, спасибо!