SRV(3)SRV(3)
NAME
srv – server registry
SYNOPSIS
bind -c #s $srvspec /srv
/srv/clone
/srv/id/...
/srv/service1
/srv/service2
...
DESCRIPTION
The
srv
device provides a tree of directories holding
already-open channels to services.
In effect,
srv
is a bulletin board on which processes may post open file descriptors
to make them available to other processes.
To install a channel, create
a new file such as
/srv/myserv
and then write a text string (suitable for
strtoul;
see
atof(2))
giving the file descriptor number of an open file.
Any process may then open
/srv/myserv
to acquire another reference to the open file that was registered.
An entry in
srv
holds a reference to the associated file even if no process has the
file open. Removing the file from
/srv
releases that reference.
It is an error to write more than one number into a server file,
or to create a file with a name that is already being used.
Opening the
clone
file allocates a new service directory. Reading
clone
returns the
id
of the new directory.
This new service directory can then be accessed at
/srv/id.
Directories are recursive; each new service directory
contains its own
clone
file and sub-directories.
Directories can be walked from the root such as
#s/id1/id2/id3
which makes them globally addressable.
As a convention,
/lib/namespace
accepts the path to the service directory from the
environment variable
$srvspec,
making it possible to start a new namespace
using a specific service directory as a
starting point.
EXAMPLE
To drop one end of a pipe into
/srv,
that is, to create a named pipe:
int fd, p[2];
char buf[32];
pipe(p);
fd = create("/srv/namedpipe", OWRITE, 0666);
fprint(fd, "%d", p[0]);
close(fd);
close(p[0]);
fprint(p[1], "hello");
At this point, any process may open and read
/srv/namedpipe
to receive the
hello
string. Data written to
/srv/namedpipe
can be received by executing
read(p[1], buf, sizeof buf);
in the above process.
Create a disposable
/srv
and start a
factotum(4)
and a
rio(1)
in it.
<[3]/srv/clone{
id=`{<[0=3]read}
<[3=]@{ # close the clone fd
rfork n
bind -c /srv/$id /srv
auth/factotum -s factotum
rio
}
}
SOURCE
/sys/src/9/port/devsrv.c