监控失败过程

时间:2017-01-17 18:01:41

标签: unix ocaml system

我正在开发一个简单的模糊测试工具,它涉及生成某些文件类型的有效实例,并监视被测试的程序是否失败。这个工具的一个关键组件是一个进程监视器模块:该模块应该提供一些函数,给定表示程序路径和参数的字符串(例如,corrupt.pyrandom_file.wav)指示是否调用{{1}触发一些错误。

定义一个监视OCaml中挂起或抛出错误的过程的函数的最简单方法是什么?我计划在循环中运行这样的函数,因此转移副作用(例如,打印到std.out的内容)很关键。这种函数的类型签名应该是沿着字节行的类型 - > int,其中int具有一些相关含义(例如,0 - >健康退出)。

此外,我知道暂停问题使得无法判断暂停是否是意外行为,所以我可以在任意等待时间画线。

1 个答案:

答案 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,您可以尝试。