Handles versus File Descriptors

STDLIB provides a POSIX-like abstraction of file descriptors which unifies the different types of resource and permits a single API to be used across all of them. This is a significantly different approach from Win32 and the Symbian platform, both of which have separate APIs for each distinct type of resource.

STDLIB supports files stored in the file system, sockets, a console, and a /dev/null device. The first time STDLIB initialises its internal file descriptor table it creates an emulated console device and attaches it to descriptors 0, 1 and 2. The emulated console device will appear as a window when it is first used (i.e. when the program writes to or reads from the console).

The open() function recognises the following names:

  • CON: is taken to mean a newly-created console. This will never be the same console as the one automatically associated with 0, 1 and 2.

  • NUL: is taken to mean a /dev/null device.

  • TMP: is taken to mean a temporary file, which will use the underlying Symbian platform file system facilities to create a uniquely-named temporary file, and will cause the file to be deleted after it has been closed cleanly.

  • COMx: is the serial port where x is a number from 1 to 9. COM1: corresponds to serial port zero and so on.

  • IRCOMx: is the serial port where x is a number from 1 to 9.

The number of open files in the file has no explicit limit.

The Symbian platform resources such as RFile and RSocket are derived from class RSubSessionBase, so are thread specific. This means they cannot be used by any thread other than the one which opened them. In STDLIB however, the CPosixServer, if running, controls the master file descriptor table. In this case, all STDLIB threads in a process may share their resources, because the STDLIB implementation forwards all I/o requests to the resources owned by that process's CPosixServer thread. If no CPosixServer is running, each thread has a separate file descriptor table and the resources are not shareable.