open(), dup(), and close()
Another convenient service that the resource manager shared library provides is the automatic handling of dup() messages.
fd = open ("/dev/device", O_RDONLY);
...
fd2 = dup (fd);
...
fd3 = dup (fd);
...
close (fd3);
...
close (fd2);
...
close (fd);
The client would generate an io_open
message
for the first open(),
and then two io_dup
messages for the two
dup() calls.
Then, when the client executed the
close() calls,
three io_close
messages would be generated.
Since the dup() functions generate duplicates of
the file descriptors, new context information should not be
allocated for each one. When the io_close
messages arrive, because no new context has been allocated
for each dup(), no release of the memory
by each io_close
message should occur either!
(If it did, the first close would wipe out the context.)
The resource manager shared library provides default
handlers that keep track of the open(),
dup(), and close() messages and
perform work only for the last close (i.e., the third
io_close
message in the example above).