Листинг A.10. Функции writer, server, reader для интерфейса дверей
//bench/bw_door.c
45 void
46 writer(int doorfd)
47 {
48 int ntowrite;
49 door_arg_t arg;
50 arg.desc_ptr = NULL; /* дескрипторы не передаются */
51 arg.desc_num = 0;
52 arg.rbuf = NULL; /* значения не возвращаются */
53 arg.rsize = 0;
54 for(;;) {
55 Read(contpipe[0], &ntowrite, sizeof(ntowrite));
56 while (ntowrite > 0) {
57 arg.data_ptr = buf;
58 arg.data_size = xfersize;
59 Door_call(doorfd, &arg);
60 ntowrite –= xfersize;
61 }
62 }
63 }
64 static int ntoread, nread;
65 void
66 server(void *cookie, char *argp, size_t arg_size,
67 door_desc_t *dp, size_t n_descriptors)
68 {
69 char c;
70 nread += arg_size;
71 if (nread >= ntoread)
72 Write(contpipe[0], &c, 1); /* запись закончена */
73 Door_return(NULL, 0, NULL, 0);
74 }
75 void
76 reader(int doorfd, int nbytes)
77 {
78 char c;
79 ssize_t n;
80 ntoread = nbytes; /* глобальные переменные процедуры сервера */
81 nread = 0;
82 Write(contpipe[1], &nbytes, sizeof(nbytes));
83 if ((n = Read(contpipe[1], &c, 1)) != 1)
84 err_quit("reader: pipe read returned %d", n);
85 }