我想把下面的命令从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
与当前进程使用的文件描述符连接起来。
您可以将返回的描述符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.system
,它应该可以开箱即用。
我不确定我是否正确理解您的问题,但如果您只是想使用与当前进程相同的通道,请查看Core.Std.Unix中的fork_exec
:
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返回给父进程。