Главная страница Взаимодействие нетривиальных процессов и st ino структуры stat и получающийся ключ IPC. Эти три значения выводятся в щестнадцатеричном формате, поэтому легко видеть, как именно ключ IPC формируется из этих двух значений и идентификатора 0x57. Листинг 3.1Получение и вывод информации о файле и созданного ключа IPC svipc/ftok.c 1 finclude unpipc.h 2 int 3 main (int argc, char **argv) 5 struct stat stat; 6 if (argc != 2) 7 err quit( usage: ftok <pathname> ); 8 Stat(3rgv[l]. &stat); 9 printf( st clev: XIk, stjno: XIk, key; %к\п , 10 (ujong) stat.st clev. (ujong) stat.stjno. 11 Ftok(argv[l]. 0x57)); 12 exit(O); 13 } Выполнение этой программы в системе Solaris 2.6 приведет к следующим результатам: Solaris % ftok /etc/systera st clev: 800018, stJno: 4alb, key; 57018alb Solaris % ftok /usr/tmp st clev; 800015, stJno; 10b78, key: 57015b78 Solaris % ftok /home/rstevens/Mail.out st clev: 80001f, st ino; 3b03, key: 5702fb03 Очевидно, идентификатор определяет старшие 8 бит ключа; младшие 12 бит st dev определяют следующие 12 бит ключа, и наконец, младшие 12 бит st 1no определяют младшие 12 бит ключа. Цель этого примера не в том, чтобы впоследствии рассчитывать на такой способ формирования ключа из перечисленной информации, а в том, чтобы проиллюстрировать алгоритм комбинации полного имени и идентификатора конкретной реализацией. В других реализациях алгоритм может быть другим. ПРИМЕЧАНИЕ-- В FreeBSD используются младшие 8 бит идентификатора, младшие 8 бит st dev и младшие 16 бит st ino. Учтите, что отображение, производимое функцией ftok, - одностороннее, поскольку часть бит st dev и st ino не используются. По данному ключу нельзя определить полное имя файла, заданное для вычислений. 3.3. Структура ipc perm Для каждого объекта IPC, как для обычного файла, в ядре хранится набор информации, объединенной в структуру. Все исходные тексты, опубликованные в этой книге, вы можете найти по адресу http: www.piter.com/ download. struct ipc perm { uid t uid; /*идентификатор пользователя владельца*/ gid t gid: /*идентификатор группы владельца */ uid t cuid: /*идентификатор пользователя создателя*/ gid t cgid; /*идентификатор группы создателя*/ mode t mode: /*разрешения чтения-записи*/ ulong t seq: /*последовательный номер канала*/ key t key; /* ключ IPC */ }. Эта структура вместе с другими переименованными константами для функций System V IPC определена в файле <sys/ipc.h>. В этой главе мы расскажем о полях структуры 1рс регт более подробно. 3.4. Создание и открытие каналов IPC Три функции getXXX, используемые для создания или открытия объектов IPC (табл. 3.1), принимают ключ IPC (типа keyt) в качестве одного из аргументов и возвращают целочисленный идентификатор. Этот идентификатор отличается от того, который передавался функции ftok, как мы вскоре увидим. У приложения есть две возможности задания ключа (первого аргумента функций getXXX): 1. Вызвать ftok, передать ей полное имя и идентификатор. 2. Указать в качестве ключа константу IPC PRIVATE, гарантирующую создание нового уникального объекта IPC. Последовательность действий иллюстрирует рис. 3.1.
открытие или создание канала IPC Рис. 3.1. Вычисление идентификаторов IPC по ключам доступ к каналу IPC Все три функции getXXX (табл. 3.1) принимают в качестве второго аргумента набор флагов oflag, задающий биты разрещений чтения-записи (поле mode структуры 1 рс регт) для объекта IPC и определяющий, создается ли новый объект IPC или производится обращение к уже существующему. Для этого имеются следующие правила. ш Ключ IPC PRIVATE гарантирует создание уникального объекта IPC. Никакие возможные комбинации полного имени и идентификатора не могут привести к тому, что функция ftok вернет в качестве ключа значение IPC PRIVATE. ш Установка бита I PC CREAT аргумента oflag приводит к созданию новой записи для указанного ключа, если она еще не существует. Если же обнаруживается существующая запись, возвращается ее идентификатор. ш Одновременная установка битов IPC CREAT и IPC EXCL аргумента o/fag приводит к созданию новой записи для указанного ключа только в том случае, если такая запись еще не существует. Если же обнаруживается существующая запись, функция возвращает ощибку EEXIST (объект IPC уже существует). Комбинация IPC CREAT и IPC EXCL в отнощенйи объектов IPC действует аналогично комбинации 0 CREAT и 0 EXCL для функции open. Установка только бита IPC EXCL без IPC CREAT никакого эффекта не дает. Логическая диаграмма последовательности действий при открытии объекта IPC изображена на рис. 3.2. В табл. 3.2 показан альтернативный взгляд на этот процесс. начало создается новая запись { создание новой записи, возвращение 1<дантификатора key == IPC PRIVATE? системные таблицы заполнены? ключ уже существует? нет -> установлен флаг IPC GREAT? возвращает ошибку, ermo=ENOSPC возвращает ошибку, ermo=ENOENT обращение к существующей < записи
Д, возвращает ошибку, ermo=EEXIST возвращает ошибку, ermo=EACCES возвращение идентификатора Рис. 3.2. Диаграмма открытия объекта IPC Обратите внимание, что в средней строке табл. 3.2 для флага I PC CREAT без I PC EXCL мы не получаем никакой информации о том, был ли создан новый объект или получен доступ к существующему. Для большинства приложений характерно создание сервером объекта IPC с указанием IPC CREAT (если безразлично, существует ли уже объект) или I PC CREAT I PC EXCL (если требуется проверка суще-
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |