我在OCaml
中编写了一个分析器,分析器接受一个文件作为参数并返回一个评估:GOOD
,BAD
,.我有一个makefile
一个一个地启动一组文件的分析器。
对于一些巨大的文件,需要很长的时间来分析。因此,我想为分析设置一个定时器:如果分析时间超过3秒,将停止对当前文件的分析,并返回TOO LONG
,然后继续处理下一个文件。
有人能告诉我把这个计时器加在哪里吗?在OCaml
中还是在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
秒太短了,所以我得到了
143
,对于无法用0.001
二次完成的分析。/bin/bash: line 10: 60202 Terminated ./analyze $f
,我想这种信息是打印出来的,当分析不能用0.001
第二吗?/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
,它将立即启动一个新的命令行。有人知道为什么吗?
发布于 2013-09-23 22:50:56
如果您想在OCaml中这样做,您可能最终会使用来自Unix
模块的定时器和信号。或者,如果您愿意,可以使用bash中的相同信号和定时器。
下面是一些运行<program>
的bash代码,以便在<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 $$?
如果你不知道,这可能看起来很疯狂。需要注意的点是:(A)需要在第一个命令行的开头有一个实际的TAB字符;(B)除了最后一个命令行的末尾需要有\
(在单个shell中运行所有命令);(C)需要用;
或&
分隔命令(因为shell将其看作是一行长的命令);(D)需要在需要$
时使用$$
,因为$
是特殊的。我测试过这个,它对我有用。
如果您不喜欢处理make和bash的语法复杂性,那么您可能需要在OCaml中这样做。
更新2
我不知道到底是什么导致了你最后看到的停顿。几乎可以肯定的是,make是在等待它已经启动的程序,而该程序并不是因为某种原因退出的。您可能会运行ps
来查看哪些程序仍在运行,而这些程序可能不应该运行。如果您可以减少到我(或我们)可以复制的少量代码,那么应该不难搞清楚正在发生什么,并可能修复它。
https://stackoverflow.com/questions/18969457
复制相似问题