    The next step up the ladder is the construction of a child-process
monitor. Here, the parent process is responsible for all its child processes,
but it also must read their standard output. The user enters information at
the standard input of the parent process. A simple emi(command language) is
used for this:
    itemization(
    itt(start): this starts a new child process. The parent returns the
child's ID (a number) to the user. The ID is thereupon be used to identify a
particular child process;
    itt(<nr> text) sends ``tt(text)'' to the child process having ID
tt(<nr>);
    itt(stop <nr>) terminates the child process having ID tt(<nr>);
    itt(exit) terminates the parent as well as all its child processes.
    )
    If a child process hasn't received text for some time it will complain by
sending a message to the parent-process. Those messages are simply transmitted
to the user by copying them to the standard output stream.

    A problem with programs like our monitor is that they allow
        emi(asynchronous input) from multiple sources. Input may appear at the
standard input as well as at the input-sides of pipes. Also, multiple output
channels are used. To handle situations like these, the ti(select) system
call was developed.
