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