0

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

对于一些大文件,分析需要很长时间。所以我想为分析设置一个计时器:如果分析时间超过3秒,则停止当前文件的分析并TOO LONG返回,我们继续下一个文件......

谁能告诉我在哪里添加这个计时器?围绕函数 inOCaml或 in makefile? 怎么做?

编辑:一部分makefile

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秒钟内完成时打印的?

从字面上看,关于发生的事情,这些消息看起来仍然很奇怪......

编辑2:

我以秒为计时器对大约 4000 个文件运行分析器3,因此大部分分析可以在3几秒钟内完成。他们给了我很多信息,例如/bin/bash: line 9: kill: (60241) - No such process

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

4

1 回答 1

0

如果您想在 OCaml 中执行此操作,您可能最终会使用来自Unix模块的计时器和信号。或者,如果您愿意,也可以使用 bash 中的这些相同信号和计时器。

这是一些要运行的 bash 代码,如果到那时它还没有完成,它将在几秒钟<program>后被杀死。<N>

<program> &
PID=$!
(sleep <N>; kill $PID) &
wait $PID
echo $?

你的程序应该使用小于 126 的退出代码;否则它们会与 bash 使用的值发生冲突。假设您遵循此约定,大于 128 的值$?表示程序已被信号终止。(对于这个特定的代码,您应该看到值 143。)小于 126 的值表示您的程序自行退出。

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

更新

这是一个包含上述代码的 Makefile,其中包含程序和超时的具体替换。

testrun: myprogram
    myprogram & \
    PID=$$! ; \
    (sleep 3; kill $$PID) & \
    wait $$PID ; \
    echo $$?

如果您不太了解 make(1),这可能看起来很疯狂。需要注意的点是(A)需要在第一个命令行的开头有一个实际的 TAB 字符;(B) 需要\在除最后一个命令行之外的所有命令的 END 处(在单个 shell 中运行所有命令);(C) 需要用;or分隔命令&(因为 shell 将其视为一长行);(D) 需要时使用$$$因为$是特殊制作。我对此进行了测试,它对我有用。

如果您不想处理 make 和 bash 的语法复杂性,您可能希望在 OCaml 中执行此操作。

更新 2

我不确定是什么导致了您最后看到的暂停。几乎可以肯定,make 正在等待它已启动的程序,并且该程序由于某种原因没有退出。您可能会运行ps以查看哪些程序仍在运行,而这些程序可能不应该运行。如果您可以减少我(或我们)可以重现的少量代码,那么弄清楚发生了什么并可能修复它应该不难。

于 2013-09-23T22:50:56.953 回答