[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Именованные каналы - Пример - Клиент

Программа-клиент создает  личный  именованный  канал,  посылает  имена
этого канала  и требуемого файла файловому серверу через общедоступный
именованный  канал.   Затем  она   распечатывает   содержимое   файла,
полученное через личный именованный канал.

1-2       Эти файлы  описывают различные  типы файлов  для  системного
          вызова mknod(2).

13-17     Синтезируется имя  личного программного  канала, и создается
          сам этот канал с правами чтения и записи для всех процессов.

18-23     Общедоступный именованный  канал открывается  на запись, и в
          него записываются имена личного канала и требуемого файла.

25-27     Личный именованный канал открывается для чтения.

29-30     Распечатываются данные, полученные из личного канала.

31-32     Личный именованный  канал закрывается и удаляется из текущей
          директории.

Заметьте, что  сервер и  клиент должны  соблюдать соглашение о формате
данных, записываемых в общедоступный канал.

Файловый сервер работает таким образом:
$ server &
$ client data
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ


Файл: client1.c
                 ИМЕНОВАННЫЕ КАНАЛЫ - ПРИМЕР - КЛИЕНТ

 1      #include <sys/types.h>
 2      #include <sys/stat.h>
 3      #include <fcntl.h>
 4      #include <sys/uio.h>
 5      #include "server.h"
 6
 7      main(int argc, char **argv)/* client process */
 8      {
 9      struct message msg;
10      int n, fdpub, fdpriv;
11      char line[LINESIZE];
12
13      sprintf(msg.privfifo, "Fifo%d", getpid());
14      if(mknod(msg.privfifo,S_IFIFO | 0666,0) == -1) {
15      perror(msg.privfifo);
16      exit(1);
17      }
18      if ((fdpub = open(PUBLIC, O_WRONLY)) == -1) {
19      perror(PUBLIC);
20      exit(2);
21      }
22      strcpy(msg.filename, argv[1]);
23      write(fdpub, (char *) &msg, sizeof(msg));
24
25      if((fdpriv = open(msg.privfifo,O_RDONLY)) == -1) {
26      perror(msg.privfifo);
27      exit(3);
28      }
29      while ((n = read(fdpriv, line, LINESIZE)) > 0)
30      write(1, line, n);
31      close(fdpriv);
32      unlink(msg.privfifo);
33      exit(0);
34      }