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