sig
  module Async :
    sig
      type producer = string JoinCom.P.t
      type t = {
        out : JoinTextProc.Async.producer;
        err : JoinTextProc.Async.producer;
        waitpid : Unix.process_status Join.chan Join.chan;
        kill : int -> unit;
        gkill : int -> unit;
      }
      val command : string -> string array -> JoinTextProc.Async.t
      val open_in : string -> string array -> JoinTextProc.Async.t
      val open_out :
        string ->
        string array -> JoinTextProc.Async.producer -> JoinTextProc.Async.t
      val open_in_out :
        string ->
        string array -> JoinTextProc.Async.producer -> JoinTextProc.Async.t
      val open_full :
        string ->
        string array -> JoinTextProc.Async.producer -> JoinTextProc.Async.t
    end
  module Sync :
    sig
      type text = string list
      type result = {
        st : Unix.process_status;
        out : JoinTextProc.Sync.text;
        err : JoinTextProc.Sync.text;
      }
      type t = {
        wait : unit -> JoinTextProc.Sync.result;
        kill : int -> unit;
        gkill : int -> unit;
      }
      val command : string -> string array -> JoinTextProc.Sync.t
      val open_in : string -> string array -> JoinTextProc.Sync.t
      val open_in_out :
        string ->
        string array -> JoinTextProc.Sync.text -> JoinTextProc.Sync.t
      val open_full :
        string ->
        string array -> JoinTextProc.Sync.text -> JoinTextProc.Sync.t
    end
end