Andrew,
I'm a fan of Plan 9's elegance and clean design, but beware of the limitations
of the abstractions you choose. One place that files and connections don't work
cleanly is in actual datagram networking. You can do TCP easily, but UDP and especially
broadcast/multicast make a hash of the abstraction. That's how you end up with
sendto(2), sendmsg(2), recvfrom(2), recvmsg(2).
One could also point to the seemingly endless number of ioctl(2) commands as a failure of
the file abstraction to encompass all the necessary service elements - hence that escape
mechanism.
This is the wonder and the problem of Turing machines: they can do almost anything - so
what functions and services do you expose, and what do you hide? What is most useful to a
large enough group of software developers and users that your model will be accepted,
used, supported by contribution, and perhaps lauded?
Whenever we want total control, we can always revert to assembly and/or machine language.
Or beach sand.
Erik Fair