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。
我想制作一个可以使暂停时间少于 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。