首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ocaml pause Unix select

Ocaml pause Unix select
EN

Stack Overflow用户
提问于 2018-12-14 22:23:48
回答 1查看 295关注 0票数 1

我想做一个能让暂停时间少于1秒的函数。所以我做了这个函数:

代码语言:javascript
复制
let pause(n:float)=
Unix.select [] [] [] n
;;

我这样使用它:

代码语言:javascript
复制
ignore(pause(0.1));

顶层给我返回了这个错误:

代码语言:javascript
复制
Exception: Unix.Unix_error (Unix.EINTR, "select", "").

我该怎么做?

附注:我也尝试过使用Thread.delay,但我也遇到了同样的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-14 22:49:51

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

假设您使用的是OCaml 4.03或更高版本,您可以使用Unix.sleepf函数,它可以执行您所期望的操作:

代码语言:javascript
复制
# Unix.sleepf;;
- : float -> unit = <fun>

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

代码语言:javascript
复制
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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53781533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档