[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Именованные каналы - Пример - Файловый сервер
В struct message содержатся имя личного именованного канала вместе с
именем требуемого файла.
Программа файлового сервера в этом примере открывает на чтение
общедоступный именованный канал. Он спит до тех пор, пока какой-нибудь
процесс-клиент не откроет другой конец этого канала. Тогда сервер
читает из общедоступного канала имена личного канала и требуемого
файла в соответствующие поля структуры. Затем, сервер открывает личный
канал и требуемый файл. Содержимое файла копируется в канал, и файл
закрывается. Затем, закрыв общедоступный канал, программа возвращается
назад, снова открывает общедоступный канал и ждет обращения следующего
клиента.
9 Здесь определяется структура сообщения, которое читается из
общедоступного именованного канала.
14-17 Общедоступный канал открывается для чтения. Системный вызов
open(2) блокируется, если никакой процесс-клиент не
открывает другой конец канала.
18-19 Из общедоступного канала читается сообщение, содержащее
имена личного канала и требуемого файла.
20-23 Требуемый файл открывается для чтения.
24 Личный канал открывается для записи. Файловый сервер спит,
пока клиент не откроет свой конец личного канала. Если
возникли проблемы, и клиент не может открыть канал, сервер
повиснет внутри этого open(2). Решение этой проблемы будет
показано в следующем примере.
28-29 Данные из файла копируются в личный именованный канал.
30-31 Когда копирование закончено, требуемый файл и личный
именованный канал закрываются.
33-34 Общедоступный канал также закрывается, и сервер переходит к
следующему витку цикла. Причина для закрытия и повторного
открытия состоит в том, что хочется, чтобы файловый сервер
спал на open(2), ожидая запросов.
Заметьте, что программа никогда не завершается.
Файл: server1.c
ИМЕНОВАННЫЕ КАНАЛЫ - ПРИМЕР - ФАЙЛОВЫЙ СЕРВЕР
1 #include <sys/types.h>
2 #include <fcntl.h>
3 #include <sys/stat.h>
4 #include "server.h"
5
6 main(int argc, char **argv)/* server process */
7 {
8 int fdpub, fdpriv, fd;
9 struct message msg;
10 int n;
11 char line[LINESIZE];
12
13 loop:/* forever */
14 if ((fdpub = open(PUBLIC, O_RDONLY)) == -1) {
15 perror(PUBLIC);
16 exit(1);
17 }
18 while (read(fdpub, (char *) &msg,
19 sizeof(msg)) > 0) {
20 if ((fd = open(msg.filename, O_RDONLY)) == -1) {
21 perror(msg.filename);
22 break;
23 }
24 if ((fdpriv = open(msg.privfifo, O_WRONLY)) == -1) {
25 perror(msg.privfifo);
26 break;
27 }
28 while ((n = read(fd, line, LINESIZE)) > 0)
29 write(fdpriv, line, n);
30 close(fd);
31 close(fdpriv);
32 }
33 close(fdpub);
34 goto loop;
35 }