Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 [ 12 ] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

и 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.

char pathname

->

ttokO

fceyoflPC PRIVATE

msgget () mesgetO mhsget ()

int indentmr

msgcti 0, msgsnd (), msgrcv () semctl 0. semop (), shmctlQ, shmatO, shmdtQ

-►

открытие или создание канала 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

обращение к существующей < записи

установлены оба флага: IPC CREATh IPC EXCL?

имеюгся ли разрешени

цостаточные я доступа?

Д, возвращает ошибку, ermo=EEXIST

возвращает ошибку, ermo=EACCES

возвращение идентификатора Рис. 3.2. Диаграмма открытия объекта IPC

Обратите внимание, что в средней строке табл. 3.2 для флага I PC CREAT без I PC EXCL мы не получаем никакой информации о том, был ли создан новый объект или получен доступ к существующему. Для большинства приложений характерно создание сервером объекта IPC с указанием IPC CREAT (если безразлично, существует ли уже объект) или I PC CREAT I PC EXCL (если требуется проверка суще-



1 2 3 4 5 6 7 8 9 10 11 [ 12 ] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.