Emulating stdin/stdout/stderr in STDLIB

This section briefly describes the process of emulating in STDLIB.

Simple Mode - CCLocalSystemInterface

The following are the steps to emulate in simple mode:

  1. Create a single CTtyDesc object per thread and an instance of the basic console object.

  2. Attach the CTtyDesc object to stdin, stdout and stderr.

  3. Pass the Requests made on stdin, stdout and stderr to CTtyDesc.

There is a separate console per thread. Therefore, output is spread over a number of different consoles.

Complex Mode - CProcessSystemInterface

The following are the steps to emulate in complex mode:

  1. Start the POSIX server in the crt0 glue code.

  2. Create either a single instance of CW32StreamDesc or CReDirDesc in the POSIX server.

  3. Attach it to stdin, stdout and stderr, which is used by all threads.

    Requests made on stdin, stdout and stderr are passed to the attached descriptor object.

  4. Use CW32StreamDesc for the emulator only if the RWin32Stream server was started in the crt0 glue code.

    If CW32StreamDesc cannot be used or code is compiled for hardware, then useCRedirDesc instead.

  5. CReDirDesc connects and passes the request to a redirection server. If connection fails the output to stdout and stderr is lost. Nothing is read from stdin.

  6. The client application (for example, Java RT or the Test application) starts the redirection server. The client also provides an implementation of CStreamFactoryBase2. This implementation deals with standard I/O data in a customised way.

Stdin/stdout on emulator in complex mode

A text EXE running on the emulator can either use the wcrt0.lib or wwcrt0.lib crt0 libraries. These automatically start the RWin32Stream server to redirect stdin, stdout and stderr to the Win32 console.

Stdin/stdout on hardware in complex mode

A test EXE running on target hardware has no default console. The test application requires application/client specific C++ code to be written to create a new thread and call CRedirServer2::NewL() to start the redirection server along with client specific derived classes to plumb the I/O to wherever it is required. The POSIX server will then connect to this server when stdXXX streams are used.