2

我想将以下命令从Unix库移植到 Jane Street 的Core.Std.Unix库。

Unix.create_process exec args Unix.stdin Unix.stdout Unix.stderr

也就是说,我有一个可执行文件exec和参数args,并希望使用与当前进程相同的输入/输出/错误通道来运行该进程。

我可以接近Core.Std.Unix.create_process ~exec:exec ~args:args,但无法弄清楚如何将stdin,stdout,stderr这个函数从核心返回的值与当前进程使用的文件描述符连接起来。

4

2 回答 2

2

您可以dup2将返回的描述符返回到您当前的描述符,但我不确定这是否可行。

open Core.Std

let redirect ( p : Unix.Process_info.t ) : unit =
  let open Unix.Process_info in
  List.iter ~f:(fun (src,dst) -> Unix.dup2 ~src ~dst) [
    p.stdin,  Unix.stdin;
    p.stdout, Unix.stdout;
    p.stderr, Unix.stderr
  ]


let exec prog args : unit =
  let p = Unix.create_process ~prog ~args in
  redirect p

但是还有另一种可能适用的解决方案。考虑使用 just Unix.system,它应该可以开箱即用。

于 2014-07-30T09:20:22.717 回答
0

我不确定我是否正确理解了您的问题,但如果您只想使用与当前进程相同的通道,请查看fork_execCore.Std.Unix:

val fork_exec : prog:string ->
                args:string list ->
                ?use_path:bool -> 
                ?env:string list -> 
                unit -> Core_kernel.Std.Pid.t

根据文档,

fork_exec ~prog ~args ?use_path ?env () 在子进程中使用 args 分叉和执行 prog,将子 pid 返回给父进程。

于 2015-07-17T04:09:20.067 回答