Функции main, вызывающие новые функции client и server, вообще не претерпели никаких изменений. Мы можем использовать либо версию для работы с каналами (листинг 4.1), либо версию для работы с FIFO (листинг 4.6).
4.11. Ограничения программных каналов и FIFO
На программные каналы и каналы FIFO системой накладываются всего два ограничения:
■ OPEN_MAX — максимальное количество дескрипторов, которые могут быть одновременно открыты некоторым процессом (Posix устанавливает для этой величины ограничение снизу — 16);
■ PIPE_BUF — максимальное количество данных, для которого гарантируется атомарность операции записи (описано в разделе 4.7; Posix требует по меньшей мере 512 байт).
Значение OPEN_MAX можно узнать, вызвав функцию sysconf, как мы вскоре покажем. Обычно его можно изменить из интерпретатора команд с помощью команды ulimit (в Bourne shell и KornShell, как мы вскоре покажем) или с помощью команды limit (в С shell). Оно может быть изменено и самим процессом с помощью вызова функции setrlimit (подробно описана в разделе 7.11 [21]).
Значение PIPE_BUF обычно определено в заголовочном файле
//pipe/pipeconf.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 if (argc != 2)
6 err_quit("usage: pipeconf
7 printf("PIPE_BUF = %ld. OPEN_MAX = %ld\n",
8 Pathconf(argv[1], _PC_PIPE_BUF), Sysconf(_SC_OPEN_MAX));
9 exit(0);
10 }
Вот несколько примеров, в которых указываются имена файлов, относящиеся к различным файловым системам:
solaris % pipeconf /
PIPE_BUF = 5120, OPEN_MAX = 64
solaris % pipeconf /home
PIPE_BUF = 5120, OPEN_MAX = 64
solaris % pipeconf /tmp
PIPE_BUF = 5120, OPEN_MAX = 64
alpha % pipeconf /
PIPE_BUF = 4096, OPEN_MAX = 4096
alpha % pipeconf /usr
PIPE_BUF = 4096, OPEN_MAX = 4096
Покажем теперь, как изменить значение OPEN_MAX в Solaris, используя интерпретатор KornShell:
solaris % ulimit –nS
64
solaris % ulimit –Nh
1024
solaris % ulimit –nS 512
solaris % pipeconf /
PIPE_BUF = 5120, OPEN_MAX = 512
ПРИМЕЧАНИЕ