加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix – 为函数设置计时器

发布时间:2020-12-15 21:48:00 所属栏目:安全 来源:网络整理
导读:我已经定义了一个值列表:data:int list和function f:int – 单位和一段代码: for i = 0 to (List.length data) - 1 do let d = List.nth data i in f ddone 现在,我想设置f的最大运行时间.例如,如果f d超过某个时间最大值,则f d的执行停止,我们继续使用
我已经定义了一个值列表:data:int list和function f:int – >单位和一段代码:

for i = 0 to (List.length data) - 1 do
  let d = List.nth data i in
  f d
done

现在,我想设置f的最大运行时间.例如,如果f d超过某个时间最大值,则f d的执行停止,我们继续使用下一个数据元素.

有谁知道怎么做?

UPDATE1:

在评论之后,我想补充一点,将f应用于大部分数据元素最终会引发异常.这是正常的并被接受.所以代码看起来像:

List.iter
  (fun d ->
     try
       (f d)
     with
     | e ->
       printf "%sn" (Printexc.to_string e))
data

解决方法

这是基于Jeffrey的回答,并通过一些修改来改善异常安全性:

exception Timeout

let run_with_timeout timeout f x =
  let old_handler = Sys.signal Sys.sigalrm
    (Sys.Signal_handle (fun _ -> raise Timeout)) in
  let finish () =
    ignore (Unix.alarm 0);
    ignore (Sys.signal Sys.sigalrm old_handler) in
  try
    ignore (Unix.alarm timeout);
    ignore (f x);
    finish ()
  with Timeout -> finish ()
   | exn -> finish (); raise exn

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读