ocaml-ядро, эквивалентное Unix.create_process
Я хотел бы перенести следующую команду из библиотеки 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
возвращается этой функцией из ядра с файловыми дескрипторами, используемыми текущим процессом.
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
Но есть и другое решение, которое может быть применимо. Рассмотрите возможность использования только Unix.system
, это должно работать только из коробки.
Я не уверен, правильно ли я понимаю ваш вопрос, но если вы просто хотите использовать те же каналы, что и текущий процесс, посмотрите на fork_exec
в Core.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 () разветвляет и запускает prog с аргументами в дочернем процессе, возвращая дочерний pid родительскому процессу.