ex_cmd v0.1.0 ExCmd.Process View Source

Helper to interact with ExCmd.ProcessServer

Overview

Each ExCmd.ProcessServer process maps to an instance of port (and an OS process). Internally ExCmd.ProcessServer creates and manages separate processes for each of the IO streams (Stdin, Stdout, Stderr) and a port that maps to an OS process of odu. Blocking functions such as read and write only blocks the calling process, not the ExCmd.Process itself. A blocking read does not block a parallel write. Blocking calls are the primitives for building back-pressure.

For most of the use-cases using ExCmd.stream! abstraction should be enough. Use this only if you need more control over the life-cycle of IO streams and OS process.

Link to this section Summary

Functions

Waits for the program to terminate.

Closes input stream. Which signal EOF to the program

Opens the error stream of the program for reading. Blocks till writer opens

Opens the input stream of the program for writing. Blocks till reader opens

Opens the output stream of the program for reading. Blocks till writer opens

Return bytes written by the program to output stream.

Return bytes written by the program to error stream.

Opens the port and runs the program

Returns status of the process. It will be either of :started, {:done, exit_status}

Kills the program

Writes iodata data to programs input streams

Link to this section Functions

Link to this function

await_exit(server, timeout \\ :infinity)

View Source

Waits for the program to terminate.

If the program terminates before timeout, it returns {:ok, exit_status} else returns :timeout

Closes input stream. Which signal EOF to the program

Opens the error stream of the program for reading. Blocks till writer opens

Opens the input stream of the program for writing. Blocks till reader opens

Opens the output stream of the program for reading. Blocks till writer opens

Returns port_info

Link to this function

read(server, timeout \\ :infinity)

View Source
read(pid(), non_neg_integer() | :infinity) ::
  {:ok, iodata()} | :eof | {:error, String.t()} | :closed

Return bytes written by the program to output stream.

This blocks until the programs write and flush the output

Link to this function

read_error(server, timeout \\ :infinity)

View Source
read_error(pid(), non_neg_integer() | :infinity) ::
  {:ok, iodata()} | :eof | {:error, String.t()} | :closed

Return bytes written by the program to error stream.

This blocks until the programs write and flush the output

Opens the port and runs the program

Link to this function

start_link(cmd, args, opts \\ %{})

View Source

Starts ExCmd.ProcessServer

Starts a process for running cmd with arguments args with options opts. Note that this does not run the program immediately. User has to explicitly run by calling run/1, open_input/1, open_output/1 depending on the program.

Options

  • use_stderr - Whether to allow reading from stderr. Note that setting true but not reading from stderr might block external program due to back-pressure. Defaults to false
  • log - When set to true odu outputs are logged. Defaults to false

Returns status of the process. It will be either of :started, {:done, exit_status}

Kills the program

Link to this function

write(server, data, timeout \\ :infinity)

View Source
write(pid(), iodata(), non_neg_integer() | :infinity) ::
  :ok | {:error, String.t()} | :closed

Writes iodata data to programs input streams

This blocks when the fifo is full