首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在OCaml或Shell中设置定时器

在OCaml或Shell中设置定时器
EN

Stack Overflow用户
提问于 2013-09-23 21:46:29
回答 1查看 419关注 0票数 0

我在OCaml中编写了一个分析器,分析器接受一个文件作为参数并返回一个评估:GOODBAD,.我有一个makefile一个一个地启动一组文件的分析器。

对于一些巨大的文件,需要很长的时间来分析。因此,我想为分析设置一个定时器:如果分析时间超过3秒,将停止对当前文件的分析,并返回TOO LONG,然后继续处理下一个文件。

有人能告诉我把这个计时器加在哪里吗?在OCaml中还是在makefile中?那怎么做呢?

编辑:makefile的一部分

代码语言:javascript
运行
复制
allev:  all
        @n=0; \
        for f in \
        `find . -ipath '*/fetch/evs/*.ev' -exec grep -L -e "' Error" {} \;`; \
        do \
            let "n+=1"; \
            echo "oooooooooooooooooooooooooooooooooooooooo" $$n; \
            echo $$f; \
            ./$(BIN) $$f & \
            PID=$$!; \
            (sleep 0.001; kill $$PID) & \
            wait $$PID; \
            echo $$?; \
        done

实际上,对于大多数的分析来说,0.001秒太短了,所以我得到了

  1. 大量的143,对于无法用0.001二次完成的分析。
  2. /bin/bash: line 10: 60202 Terminated ./analyze $f,我想这种信息是打印出来的,当分析不能0.001第二吗?
  3. /bin/bash: line 9: kill: (60241) - No such process,我猜这种信息是打印出来的,分析什么时候能用0.001完成?

从字面上讲,这些信息对于发生的事情仍然很奇怪.

Edit2:

我在大约4000个文件上运行分析器,计时器为3秒,所以大部分分析可以在3秒内完成。因此,他们给了我很多像/bin/bash: line 9: kill: (60241) - No such process这样的消息。

奇怪的是,在分析完所有文件之后,终端的游标没有启动新的命令行。如果我按下Ctrl+C,它将立即启动一个新的命令行。有人知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 22:50:56

如果您想在OCaml中这样做,您可能最终会使用来自Unix模块的定时器和信号。或者,如果您愿意,可以使用bash中的相同信号和定时器。

下面是一些运行<program>的bash代码,以便在<N>秒之后,如果到那个时候还没有完成,它就会被杀死。

代码语言:javascript
运行
复制
<program> &
PID=$!
(sleep <N>; kill $PID) &
wait $PID
echo $?

您的程序应该使用小于126的退出代码;否则它们将与bash使用的值发生冲突。假设您遵循此约定,$?的值大于128个,表示程序被信号杀死。(对于这个特定的代码,您应该看到值143。)小于126的值将指示您的程序退出其自己的自由意志。

信号很难得到正确的处理,我只测试过这段代码几次。我希望它有用。

更新

下面是一个Makefile,其中包含上面的代码,并具体替换了程序和超时。

代码语言:javascript
运行
复制
testrun: myprogram
    myprogram & \
    PID=$$! ; \
    (sleep 3; kill $$PID) & \
    wait $$PID ; \
    echo $$?

如果你不知道,这可能看起来很疯狂。需要注意的点是:(A)需要在第一个命令行的开头有一个实际的TAB字符;(B)除了最后一个命令行的末尾需要有\ (在单个shell中运行所有命令);(C)需要用;&分隔命令(因为shell将其看作是一行长的命令);(D)需要在需要$时使用$$,因为$是特殊的。我测试过这个,它对我有用。

如果您不喜欢处理make和bash的语法复杂性,那么您可能需要在OCaml中这样做。

更新2

我不知道到底是什么导致了你最后看到的停顿。几乎可以肯定的是,make是在等待它已经启动的程序,而该程序并不是因为某种原因退出的。您可能会运行ps来查看哪些程序仍在运行,而这些程序可能不应该运行。如果您可以减少到我(或我们)可以复制的少量代码,那么应该不难搞清楚正在发生什么,并可能修复它。

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

https://stackoverflow.com/questions/18969457

复制
相关文章

相似问题

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