Ocaml 暂停 Unix select

Ocaml pause Unix select

我想制作一个可以使暂停时间少于 1 秒的功能。 所以我做了这个功能:

let pause(n:float)=
Unix.select [] [] [] n
;;

我是这样使用它的:

ignore(pause(0.1));

顶层 return 我这个错误:

Exception: Unix.Unix_error (Unix.EINTR, "select", "").

我该怎么办?

P.S。我也试过 Thread.delay 但我有同样的错误。

这意味着在调用 select 期间向您的程序发送了一个信号。

假设您使用的是 OCaml 4.03 或更高版本,您可以使用 Unix.sleepf 函数,它完全符合您的期望:

# Unix.sleepf;;
- : float -> unit = <fun>

在旧版本的 OCaml 上,您可以使用 setitimer 函数,这将需要一些信号处理:

exception Alarm
let () = Sys.set_signal Sys.sigalrm ( Sys.Signal_handle (fun _ -> raise Alarm) )

let pause f =
  let _ = Unix.setitimer Unix.ITIMER_REAL
            { Unix.it_interval = 0.; Unix.it_value = f; } in
  try Unix.sleep (int_of_float (ceil f)) with
  | Alarm -> ()

请注意,这并不是真正的线程安全,并且会与 SIGALRM 的其他用途发生冲突。我强烈建议您切换到最新版本的 OCaml。