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

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

Таблица 1.2 (продолжение)

Тип IPC

Пространство имен для создания или открытия

Идентификатор после открытия

Posix. 1 1996

Unix 98

Разделяемая

Ключ key t

Идентификатор IPC

память System V

System V

Двери (doors)

Имя файла

Дескриптор

Удаленный вызов

Программа/версия

Дескриптор (handle)

процедур (RPC) Sun

Сокет TCP

IP-адрес и порт TCP

Дескриптор

Ig

Сокет UDP

IP-адрес и порт TCP

Дескриптор

Доменный сокет

Полное имя файла

Дескриптор

Ig

Unix (domain socket)

Здесь также указано, какие формы IPC содержатся в стандарте Posix. 11996 года и какие были включены в стандарт Unix 98. Об обоих этих стандартах более подробно рассказано в разделе 1.7. Для сравнения мы включили в эту таблицу три типа сокетов, которые подробно описаны в [24]. Обратите внимание, что интерфейс сокетов (Application Program Interface - API) стандартизируется рабочей грзшпой Posix.lg и должен в будущем стать частью стандарта Posix. 1.

Хотя стандарт Posix. 1 и дает возможность использования семафоров, их поддержка не является обязательной для производителей. В табл. 1.3 сведены функции, описанные в стандартах Posix. 1 и Unix 98. Каждая функция может быть обязательной (mandatory), неопределенной (not defined) или необязательной (дополнительной - optional). Для необязательных функций мы указываем имя константы (например, POSIX THREADS), которая будет определена (обычно в заголовочном файле <unistd.h>), если эта функция поддерживается. Обратите внимание, что Unix 98 содержит в себе Posix. 1 в качестве подмножества.

Таблица 1.3. Доступность различных форм IPC

Тип IPC

Posix. 1 1996

Unix 98

Программный канал

Обязателен

Обязателен

FIFO

Обязателен

Обязателен

Взаимное исключение Posix

POSIX THREADS

Обязателен

Условная переменная Posix

POSIX THREADS

Обязателен

Взаимные исключения и условные

POSIX THREADS

Обязателен

переменные между процессами

PROCESS SHARED

Блокировка чтения-записи Posix

(He определен)

Обязателен

Блокировка записей fcntl

Обязателен

Обязателен

Очередь сообщений Posix

POSIX MESSAGE

XOPEN REALTIME

PASSING

Семафоры Posix

POSIX SEMAPHORES

XOPEN REALTIME

Память с общим доступом Posix

POSIX SHARED

XOPEN REALTIME

MEMORY OBJECTS

Очередь сообщений System V

(He определен)

Обязателен

Семафор System V

(He определен)

Обязателен

Память с общим доступом System V

(He определен)

Обязателен

Двери (doors)

(He определен)

(Не определен)

Удаленный вызов процедур Sun

(He определен)

(Не определен)



1.5. Действие команд fork, exec и exit на объекты IPC

Тип IPC

Posix.l 1996

Unix 98

Отображение памяти mmap

POSIX MAPPED FILES

Обязателен

или POSIX SHARED

MEMORY OBJECTS

Сигналы реального времени

POSIX REALTIME

XOPEN REALTIME

(realtime signals)

SIGNALS

1.5. Действие команд fork, exec и exit на объе1сты IPC

Нам нужно достичь понимания действия функций fork, exec и exit на различные формы IPC, которые мы обсуждаем (последняя из перечисленных функций вызывается функцией exit). Информация по этому вопросу сведена в табл. 1.4.

Большинство функций описаны далее в тексте книги, но здесь нужно сделать несколько замечаний. Во-первых, вызов fork из многопоточного процесса (multithreaded process) приводит к беспорядку в безымянных переменных синхронизации (взаимных исключениях, условных переменных, блокировках и семафорах, хранящихся в памяти). Раздел 6.1 книги [3] содержит необходимые детали. Мы просто отметим в добавление к таблице, что если эти переменные хранятся в памяти с общим доступом и создаются с атрибутом общего доступа для процессов, они будут доступны любому процессу, который может обращаться к этой области памяти. Во-вторых, три формы IPC System V не могут быть открыты или закрыты. Из листинга 6.6 и упражнений 11.1 и 14.1 видно, что все, что нужно знать, чтобы получить доступ к этим трем формам IPC, - это идентификатор. Поэтому они доступны всем процессам, которым известен этот идентификатор, хотя для семафоров и памяти с общим доступом требуется некая особая обработка.

Таблица 1.4. Действие fork, exec и exit на IPC

Тип IPC

fork

exec

exit

Неименованные и именованные каналы

Очереди сообщений Posix

Очереди сообщений System V

Взаимные исключения и условные переменные Posix

Блокировки чтения-записи Possix

Порожденный процесс получает копии всех дескрипторов родительского процесса

Порожденный процесс получает копии всех открытых родительских процессов Не действует

Общий доступ, если используется разделяемая память с атрибутом разделения между процессами

Общий доступ, если используется память с общим доступом и атрибутом разделения между процессами

Все открытые дескрипторы остаются открытыми, если для них не установлен бит FD CLOEXEC

Все открытые дескрипторы очередей сообщений закрываются

Не действует

Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения

Все открытые дескрипторы закрываются, данные из программного канала и FIFO удаляются после последнего закрытия Все открытые дескрипторы очередей сообщений закрываются

Не действует

Исчезает, если не находится в разделяемой памяти, которая остается открытой и имеет атрибут разделения Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения -продолжение



Таблица 1.4 (продолжение)

Тип IPC

fork

вхес

exit

Семафоры Posix, хранящиеся в памяти

Именованные семафоры Possix

Семафоры System V

Блокировка записей fcntl

Отображение памяти

Разделяемая память Posix

Разделяемая память System V

Двери (doors)

Общий доступ, если используется память с общим доступом и атрибутом разделения между процессами Все открытые в родительском процессе остаются открытыми в порожденном Все значения semadj в порожденном процессе устанавливаются в О

Блокировки в родительском процессе не наследуются порожденным процессом

Отображения памяти родительского процесса сохраняются в порожденном

Отображения памяти родительского процесса сохраняются в порожденном

Присоединенные сегменты разделяемой памяти остаются присоединенными в порожденном процессе Порожденный процесс получает копии всех открытых дескрипторов родительского процесса, но только родительский процесс является сервером при активизации дверей через дескрипторы

Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения Все открытые закрываются

Все значения semadj передаются новой программе

Блокировки не изменяются до тех пор, пока не закроется дескриптор

Отображения памяти сбрасываются (unmap)

Отображения памяти сбрасываются

Присоединенные сегменты разделяемой памяти отсоединяются

Все дескрипторы дверей должны быть закрыты, потому что они создаются с установленным битом FD CLOEXEC

Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения Все открытые закрываются

Все значения semadj добавляются к значению соответствующего семафора Все несброшенные блокировки, установленные процессом, снимаются Отображения памяти сбрасываются

Отображения памяти сбрасываются

Присоединенные сегменты разделяемой памяти отсоединяются

Все открытые дескрипторы закрываются

1.6. Обработка ошибок: функции-обертки

в любой реальной программе при любом вызове требуется проверка возвращаемого значения на наличие ощибки. Поскольку обычно работа программ при возникновении ощибок завершается, мы можем сократить объем текста, определив функции-обертки (wrapper functions), которые осуществляют собственно вызов функции, проверяют возвращаемое значение и завершают работу при возникновении ошибок. В соответствии с соглашениями имена функций-оберток совпадают с именами самих функций, за исключением первой буквы, которая делается заглавной, например Sem post(ptr):



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.
Копирование материалов разрешено исключительно при условии цититирования.