我正在开发一个简单的模糊测试工具,它涉及生成某些文件类型的有效实例,并监视被测试的程序是否失败。这个工具的一个关键组件是一个进程监视器模块:该模块应该提供一些函数,给定表示程序路径和参数的字符串(例如,corrupt.py
和random_file.wav
)指示是否调用{{1}触发一些错误。
定义一个监视OCaml中挂起或抛出错误的过程的函数的最简单方法是什么?我计划在循环中运行这样的函数,因此转移副作用(例如,打印到std.out的内容)很关键。这种函数的类型签名应该是沿着字节行的类型 - > int,其中int具有一些相关含义(例如,0 - >健康退出)。
此外,我知道暂停问题使得无法判断暂停是否是意外行为,所以我可以在任意等待时间画线。
答案 0 :(得分:2)
您可以从Unix“高级进程和重定向管理”功能开始,例如,create_process prog args new_stdin new_stdout new_stderr
是一个通用函数,它将创建一个运行程序的进程,并允许您重定向通道。创建的进程将异步运行,因此您可以使用waitpid
的{{1}}标记来查看它,或者只是阻塞直到结束(可能后者不适合您)。
以下界面可能满足您的需求:
WNOHANG
或者您可以将其简化为
module Monitor : sig
val start : string -> t
val terminate : t -> unit
val on_finish : t -> (int -> unit) -> unit
...
end
如果您不想管理监控实例。
或者,您可以查看 val monitor : string -> (int -> 'a) -> 'a
high-level process management library。它可能会为您节省很多次击键。还有一个来自Janestreet的替代async unix library,您可以尝试。