# sub-process API

The sub-process API makes it possible to run background sub-processes for the entire lifetime of a Git invocation. If Git needs to communicate with an external process multiple times, then this can reduces the process invocation overhead. Git and the sub-process communicate through stdin and stdout.

The sub-processes are kept in a hashmap by command name and looked up via the subprocess_find_entry function. If an existing instance can not be found then a new process should be created and started. When the parent git command terminates, all sub-processes are also terminated.

This API is based on the run-command API.

## Data structures

- `struct subprocess_entry`

The sub-process structure. Members should not be accessed directly.

## Types

int(*subprocess_start_fn)(struct subprocess_entry *entry)

  User-supplied function to initialize the sub-process. This is typically used to negotiate the interface version and capabilities.

## Functions

`cmd2process_cmp`

  Function to test two subprocess hashmap entries for equality.

`subprocess_start`

  Start a subprocess and add it to the subprocess hashmap.

`subprocess_stop`

  Kill a subprocess and remove it from the subprocess hashmap.

`subprocess_find_entry`

  Find a subprocess in the subprocess hashmap.

`subprocess_get_child_process`

  Get the underlying `struct child_process` from a subprocess.

`subprocess_read_status`

  Helper function to read packets looking for the last "status=<foo>" key/value pair.