What you may think of as the file system, things like “/” for the root directory, and “/dev” the directory where devices names usually go is part of what QNX calls the “Name Space”.
Resource managers when they start up claim a piece of the name space. For example the disk driver for the file system mounted at “/” claims “/”. The serial driver will claim “/dev/ser”.
When an application does an open() call, the kernel looks at the name of what is being opened and knows which resource manager is responsible for that piece of name space so it redirects the open() call message to that resource manager’s process.
So when you do an ls on /dev/some-device, ls does a opendir() call which calls open() on “/dev/some-device”. The open call becomes an open message to the resource manager responsible for that name space. The resource manager receives that message and processes it, and replies. The application gets an fd. Thereafter all I/O calls, eg read() write() devctl() to that fd become messages that go directly to the resource manager.
Since you are writing a resource manager, you see these messages being received in your resource manager. In previous versions of QNX you had to support every such I/O message. With QNX 6 there are default message handlers, so you only need to write handlers for messages you support.
This structure is equivalent to what a monolithic kernel does, but it works very differently. If you are going to write a resource manager for QNX you need to understand this structure. QNX provides a manual/document that describes this.