[<<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    }