Таблица 1.4. Действие fork, exec и _exit на IPC
Тип IPC |
fork |
exec |
_exit |
Неименованные и именованные каналы |
Порожденный процесс получает копии всех дескрипторов родительского процесса |
Все открытые дескрипторы остаются открытыми, если для них не установлен бит FD_CLOEXEC |
Все открытые дескрипторы закрываются, данные из программного канала и FIFO удаляются после последнего закрытия |
Очереди сообщений Posix |
Порожденный процесс получает копии всех открытых родительских процессов |
Все открытые дескрипторы очередей сообщений закрываются |
Все открытые дескрипторы очередей сообщений закрываются |
Очереди сообщений System V |
Не действует |
Не действует |
Не действует |
Взаимные исключения и условные переменные Posix |
Общий доступ, если используется разделяемая память с атрибутом разделения между процессами |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Исчезает, если не находится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Блокировки чтения-записи Posix |
Общий доступ, если используется память с общим доступом и атрибутом разделения между процессами |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Семафоры Posix, хранящиеся в памяти |
Общий доступ, если используется память с общим доступом и атрибутом разделения между процессами |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Именованные семафоры Posix |
Все открытые в родительском процессе остаются открытыми в порожденном |
Все открытые закрываются |
Все открытые закрываются |
Семафоры System V |
Все значения semadj в порожденном процессе устанавливаются в 0 |
Все значения semadj передаются новой программе |
Все значения semadj добавляются к значению соответствующего семафора |
Блокировка записей fcntl |
Блокировки в родительском процессе не наследуются порожденным процессом |
Блокировки не изменяются до тех пор, пока не закроется дескриптор |
Все несброшенные блокировки, установленные процессом, снимаются |
Отображение памяти |
Отображения памяти родительского процесса сохраняются в порожденном |
Отображения памяти сбрасываются (unmap) |
Отображения памяти сбрасываются |
Разделяемая память Posix |
Отображения памяти родительского процесса сохраняются в порожденном |
Отображения памяти сбрасываются |
Отображения памяти сбрасываются |
Разделяемая память System V |
Присоединенные сегменты разделяемой памяти остаются присоединенными в порожденном процессе |
Присоединенные сегменты разделяемой памяти отсоединяются |
Присоединенные сегменты разделяемой памяти отсоединяются |
Двери (doors) |
Порожденный процесс получает копии всех открытых дескрипторов родительского процесса, но только родительский процесс является сервером при активизации дверей через дескрипторы |
Все дескрипторы дверей должны быть закрыты, потому что они создаются с установленным битом FD_CLOEXEC |
Все открытые дескрипторы закрываются |
В любой реальной программе при любом вызове требуется проверка возвращаемого значения на наличие ошибки. Поскольку обычно работа программ при возникновении ошибок завершается, мы можем сократить объем текста, определив функции-обертки (wrapper functions), которые осуществляют собственно вызов функции, проверяют возвращаемое значение и завершают работу при возникновении ошибок. В соответствии с соглашениями имена функций-оберток совпадают с именами самих функций, за исключением первой буквы, которая делается заглавной, например
Листинг 1.1. Функция-обертка к функции sem_post