private void startReaderThread(BufferedReader reader) {
		new Thread(() -> {
			try {
				while (true) {
					String line = reader.readLine();
					if (line == null) {
						break;
					}
					Msg.info(this, logPrefix + ": " + line);
				}
			}
			catch (IOException ioe) {
				// ignore io errors while reading because thats normal when shutting down
			}
			catch (Exception e) {
				Msg.error(this, "Exception while reading output from DMG process", e);
			}

		}, "DMG Server StdErr Reader Thread").start();
	}
Sends a command to the DMG server process.
<p>
ExpectedResults can be positive (ie. N result lines will be read from the
server process),
<li>0 (no result lines will be read),
<li>{@link Cmd#UNKNOWN_RESPONSE_COUNT UNKNOWN_RESPONSE_COUNT} const value
that indicates that the first response from the command will be the
number of following lines,
<li>or negative, meaning that an variable number of responses of size
abs(N) will be read from the server, where the first response from the
command is the variable number. In all, abs(N) * (first_response_int)
will be the total number of result lines returned.

@param cmdStr
@param expectedResults
@return
@throws IOException
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/dmg/DmgServerProcessManager.java