相当于Unix.create\u进程的ocaml核心

相当于Unix.create\u进程的ocaml核心,ocaml,ocaml-core,Ocaml,Ocaml Core,我想将以下命令从library移植到Jane Street的library 也就是说,我有一个可执行文件exec和参数args,希望使用与当前进程相同的输入/输出/错误通道来运行该进程 我可以接近Core.Std.Unix.create_process~exec:exec~args:args,但不知道如何将此函数从Core返回的stdin、stdout、stderr与当前进程使用的文件描述符连接起来。您可以dup2将返回的描述符与当前描述符连接起来,但我不确定这是否有效 open Core.St

我想将以下命令从library移植到Jane Street的library

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


我可以接近
Core.Std.Unix.create_process~exec:exec~args:args
,但不知道如何将此函数从Core返回的
stdin、stdout、stderr
与当前进程使用的文件描述符连接起来。

您可以
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

但还有另一个解决方案,可能是可行的。考虑使用<代码> UNIX.Stase<代码>,它应该在方框外工作。

< P>我不确定是否正确地理解了您的问题,但是如果您只想使用与当前进程相同的通道,请在内核中查看<代码> FokJuxExc< <代码>。STDUnix:

val fork_exec : prog:string ->
                args:string list ->
                ?use_path:bool -> 
                ?env:string list -> 
                unit -> Core_kernel.Std.Pid.t
根据文件,

fork_exec~prog~args?在子进程中使用_path?env()fork并执行带有args的prog,将子pid返回给父进程


重定向不起作用,但我确信如果我将命令格式化为
sh
,则
Core.Unix.system
会起作用。现在我将坚持使用标准的
Unix
。谢谢你帮我看这些文件。
val fork_exec : prog:string ->
                args:string list ->
                ?use_path:bool -> 
                ?env:string list -> 
                unit -> Core_kernel.Std.Pid.t