Unix 监视进程的故障

Unix 监视进程的故障,unix,ocaml,system,Unix,Ocaml,System,我正在开发一个简单的模糊工具,该工具涉及生成某些文件类型的有效实例,并监控测试中的程序是否失败。该工具的一个关键组件是进程监视器模块:该模块应提供一些函数,这些函数在给定表示程序路径和参数的字符串时(例如,corrupt.py和random_file.wav)指示调用currupt.py random_file.wav是否会触发某些错误 定义监控OCaml中挂起或抛出错误的过程的函数的最简单方法是什么?我计划在循环中运行这样的函数,因此转移副作用(例如,打印到std.out的内容)至关重要。这样

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

定义监控OCaml中挂起或抛出错误的过程的函数的最简单方法是什么?我计划在循环中运行这样的函数,因此转移副作用(例如,打印到std.out的内容)至关重要。这样一个函数的类型签名应该是bytes->int,其中int有一些相关的含义(例如,0->health exit)


此外,我了解到暂停问题使得无法判断暂停是否是意外行为,因此我可以在任意等待时间划清界限。

您可以从Unix“高级进程和重定向管理”功能开始,例如。,
create_process prog args new_stdin new_stdout new_stderr
是一个通用函数,它将创建一个运行程序的进程,并允许您重定向频道。创建的进程将异步运行,因此您可以使用
waitpid
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
如果您不想管理监视器实例


或者,您可以查看
Lwt
。这可能会为您节省不少击键次数。Janestreet还有一个备选方案,您可以尝试。

您可以从Unix的“高级进程和重定向管理”功能开始,例如,
创建进程prog args new\u stdin new\u stdout new\u stderr
是一个通用函数,它将创建运行程序的进程,并允许您重定向通道。创建的进程将异步运行,因此您可以使用
waitpid
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
如果您不想管理监视器实例


或者,您可以查看
Lwt
。这可能会为您节省不少击键次数。Janestreet还有一个替代方案,您可以尝试。

退出代码不经常显示。许多人
尝试。。。catch(…}{}返回0;
在main中。我怀疑您是否可以在不知道被测应用程序应该做什么的情况下使其通用。例如,应该停止?然后,已经有很多(免费)测试套件做类似的事情…只需选择一个您喜欢的。“已经有很多(免费)测试套件做类似的事情。”我这样做是为了好玩,不是为了创意。退出代码说的不多。很多人
主要是尝试…catch(…}{}return 0;
。我怀疑你能在不知道被测试的应用程序应该做什么的情况下使它成为通用的。例如,应该停止吗?那么,已经有很多(免费的)做类似事情的测试套件…只需选择一个你喜欢的。“已经有很多(免费)测试套件做类似的事情了”我这样做是为了好玩,而不是为了创意。如果你在监控可能不会终止或可能不会干净地终止的流程,那么我强烈推荐Lwt_流程模块@ivg。它使管理可能表现不佳的流程变得更加简单。如果你是模糊化的,那么运行多个版本也相对简单同时,有了
Lwt
(或任何其他一元IO库),处理输入和处理IO(包括网络)等副作用会容易得多原因有两个:第一,IO monad操作是可组合的,这使得对程序的推理更加容易。第二,Async和Lwt都是成熟的现代库,在标准库的基础上提供扩展功能。很难建议一个或另一个库,但我建议坚持Lwt进行研究/fun项目,并对工业级项目进行异步。如果您正在监控可能不会终止或可能不会干净地终止的流程,那么我强烈建议使用Lwt_流程模块@ivg。它使管理可能表现不佳的流程变得更加简单。如果您是模糊化的,那么它也会使运行相对简单同时执行多个版本的可执行文件,可能会减少完成测试所需的时间。此外,使用
Lwt
(或任何其他一元IO库),处理副作用(如输入和处理IO(包括联网))会更容易原因有两个:第一,IO monad操作是可组合的,这使得对程序的推理更加容易。第二,Async和Lwt都是成熟的现代库,在标准库的基础上提供扩展功能。很难建议一个或另一个库,但我建议坚持Lwt进行研究/fun项目,并对工业级项目进行异步。