open Base;; type fd_operation = | Redirect of Unix.file_descr | Dup of Unix.file_descr | Close ;; let perform_redirection fd operation = match operation with | Close -> Unix.close fd; | Dup fd_from -> Unix.dup2 ~cloexec:false fd_from fd; | Redirect fd_from -> Unix.dup2 ~cloexec:false fd_from fd; Unix.close fd_from; ;; external sys_exit : int -> 'a = "caml_sys_exit" let create_process ?redirects cmd args = (* let redirects = Option.value redirects [] *) let redirects = match redirects with | Some l -> l | None -> [] in match Unix.fork() with 0 -> begin try List.iter redirects ( fun (fd, operation) -> perform_redirection fd operation ); Unix.execvp cmd args with _ -> sys_exit 127 end | id -> id ;; let waitpid = Unix.waitpid;; let wait_estatus status = match status with | Unix.WEXITED i -> if i >= 128 then 128 else i; | Unix.WSIGNALED i -> 128 + i; | Unix.WSTOPPED i -> 128 + i; ;;