[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Именованные каналы - Пример - Файловый сервер без блокировки
В этой программе файловый сервер модифицирован так, чтобы решить
проблему возможного зависания в случае, если сервер открывает личный
именованный канал, а клиент не открывает свой конец этого канала. Для
этого личный канал открывается с флагом O_NDELAY. Теперь сервер
пытается открыть личный канал несколько раз и сдается после заданного
числа неудач.
24-30 Здесь личный именованный канал открывается для записи. Если
клиент не открыл свой конец канала для чтения, open(2)
возвращает неудачу, и сервер делает следующую попытку после
паузы в одну секунду. Цикл завершается, если канал был
открыт, или после заданного числа неудач.
31-34 Если открытие личного именованного канала не удалось,
программа возвращается к началу цикла.
Файл: server2.c
ИМЕНОВАННЫЕ КАНАЛЫ - ПРИМЕР - ФАЙЛОВЫЙ СЕРВЕР БЕЗ БЛОКИРОВКИ
1 #include <sys/types.h>
2 #include <fcntl.h>
3 #include <sys/stat.h>
...
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 for (i = 0; i < NUMTRIES; i++) {
25 if ((fdpriv = open(msg.privfifo, O_WRONLY |
26 O_NDELAY)) == -1)
27 sleep(1);
28 else
29 break;
30 }
31 if (fdpriv == -1) {
32 perror(msg.privfifo);
33 break;
34 }
35 while ((n = read(fd, line, LINESIZE)) > 0)
36 write(fdpriv, line, n);
37 close(fd);
38 close(fdpriv);
39 }
40 close(fdpub);
41 goto loop;
42 }