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