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 родительскому процессу.

Другие вопросы по тегам