взаимодействие между процессами
Обмен данными между программами на одном компьютере или через сеть. Для такого взаимодействия используются протоколы, гарантирующие отклик на запросы.
[http://www.lexikon.ru/dict/net/index.html]
Тематики
- сети вычислительные
- interprocess communication
- IPC
восьмизначный двоичный код для обработки нецифровой информации
—
[Е.С.Алексеев, А.А.Мячев. Англо-русский толковый словарь по системотехнике ЭВМ. Москва 1993]
Тематики
- информационные технологии в целом
- information processing code
- IPC
интегральный периферийный канал
—
[Е.С.Алексеев, А.А.Мячев. Англо-русский толковый словарь по системотехнике ЭВМ. Москва 1993]
Тематики
- информационные технологии в целом
- integrated peripheral channel
- IPC
Международная классификация изобретений
МКИ
—
[А.С.Гольдберг. Англо-русский энергетический словарь. 2006 г.]
Тематики
- энергетика в целом
Синонимы
- International Patent Classification
- IPC
Межштатная энергетическая компания (США)
—
[А.С.Гольдберг. Англо-русский энергетический словарь. 2006 г.]
Тематики
- энергетика в целом
- Interstate Power Company
- IPC
межпроцессорное взаимодействие
—
[Е.С.Алексеев, А.А.Мячев. Англо-русский толковый словарь по системотехнике ЭВМ. Москва 1993]
Тематики
- информационные технологии в целом
- interprocessor communication
- IPC
пофазное управление
—
[Я.Н.Лугинский, М.С.Фези-Жилинская, Ю.С.Кабиров. Англо-русский словарь по электротехнике и электроэнергетике, Москва, 1999 г.]
Тематики
- электротехника, основные понятия
- individual phase control
- IPC
технология Intel Intelligent Power Capability
Часть микроархитектуры Intel Core (см. — Core).
Оптимизирует расход энергии во время работы исполнительных ядер процессора.
[http://www.morepc.ru/dict/]
Тематики
- информационные технологии в целом
- Intelligent Power Capability
- IPC
центр обработки информации
—
[Е.С.Алексеев, А.А.Мячев. Англо-русский толковый словарь по системотехнике ЭВМ. Москва 1993]
Тематики
- информационные технологии в целом
- information processing center
- IPC
число команд за такт
Число машинных команд, выполняемых за один машинный такт.
[http://www.morepc.ru/dict/]
Тематики
- информационные технологии в целом
- instructions per cycle
- IPC
Англо-русский словарь нормативно-технической терминологии . academic.ru . 2015 .
Смотреть что такое "IPC" в других словарях:
IPC — [Abk. für gleichbed. engl. ion pair chromatography]: ↑ Ionenpaarchromatographie. * * * IPC [Abk. für Interprocess … Universal-Lexikon
IPC — is an initialism that may stand for: * Ikano Power Centre, a shopping mall in Mutiara Damansara, Selangor, Malaysia * India Pentecostal Church of God, the largest indigenous Pentecostal movement in India * Indian Penal Code, a penal code for all… … Wikipedia
IPC — Integrated Pollution Control (IPC) was introduced by the Environmental Protection Act 1990 to cover prescribed processes. Those within Part A are potentially the most polluting processes and are under Environment Agency Control with less… … Law dictionary
IPC — IPC: Inter Process Communications методы взаимодействия между процессами. Information Protection and Control технологии защиты конфиденциальной информации. International Personnel Certification Международная Ассоциация по… … Википедия
IPC — (InterProcess Communication) communication between programs which are simultaneously running on a multi tasking system (Computers) … English contemporary dictionary
IPC — (pronunciamos i pe ce ) sustantivo masculino 1. Sigla de Índice de Precios al Consumo , España … Diccionario Salamanca de la Lengua Española
IPC — (Sigla). m. índice de precios al consumo … Diccionario de la lengua española
IPC — Para otros usos de este término, véase IPC (desambiguación). IPC son las siglas de Índice de Precios al Consum >Wikipedia Español
IPC — Die Abkürzung IPC steht für: Índice de Precios y Cotizaciones, Aktienindex der Bolsa Mexicana de Valores, der Mexikanischen Börse Industrie PC Association Connecting Electronics Industries, vormalige Bezeichnung Industrial Printed Circuits (IPC) … Deutsch Wikipedia
IPC — (Acrónimo de [Í]ndice de [P]recios al onsumo.) ► sustantivo masculino ECONOMÍA Valor que expresa las variaciones del precio de los bienes y servicios, durante un período respecto de los anteriores. * * * IPC (pronunc. [í pé cé]) m. Econ. Sigla de … Enciclopedia Universal
IPC — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Sigles d’une seule lettre Sigles de deux lettres > Sigles de trois lettres Sigles de quatre lettres … Wikipédia en Français
Межпроцессное взаимодействие (Inter-process communication (IPC)) — это набор методов для обмена данными между потоками процессов. Процессы могут быть запущены как на одном и том же компьютере, так и на разных, соединенных сетью. IPC бывают нескольких типов: «сигнал», «сокет», «семафор», «файл», «сообщение»…
Отступление: данная статья является учебной и расчитана на людей, только еще вступающих на путь системного программирования. Ее главный замысел — познакомиться с различными способами взаимодействия между процессами на POSIX-совместимой ОС.
Именованный канал
Для передачи сообщений можно использовать механизмы сокетов, каналов, D-bus и другие технологии. Про сокеты на каждом углу можно почитать, а про D-bus отдельную статью написать. Поэтому я решил остановиться на малоозвученных технологиях отвечающих стандартам POSIX и привести рабочие примеры.
Рассмотрим передачу сообщений по именованным каналам. Схематично передача выглядит так:
Для создания именованных каналов будем использовать функцию, mkfifo():
Примечание: mode используется в сочетании с текущим значением umask следующим образом: (mode &
umask). Результатом этой операции и будет новое значение umask для создаваемого нами файла. По этой причине мы используем 0777 (S_IRWXO | S_IRWXG | S_IRWXU), чтобы не затирать ни один бит текущей маски.
Как только файл создан, любой процесс может открыть этот файл для чтения или записи также, как открывает обычный файл. Однако, для корректного использования файла, необходимо открыть его одновременно двумя процессами/потоками, одним для получение данных (чтение файла), другим на передачу (запись в файл).
В случае успешного создания FIFO файла, mkfifo() возвращает 0 (нуль). В случае каких либо ошибок, функция возвращает -1 и выставляет код ошибки в переменную errno.
Типичные ошибки, которые могут возникнуть во время создания канала:
- EACCES — нет прав на запуск (execute) в одной из директорий в пути pathname
- EEXIST — файл pathname уже существует, даже если файл — символическая ссылка
- ENOENT — не существует какой-либо директории, упомянутой в pathname, либо является битой ссылкой
- ENOSPC — нет места для создания нового файла
- ENOTDIR — одна из директорий, упомянутых в pathname, на самом деле не является таковой
- EROFS — попытка создать FIFO файл на файловой системе «только-на-чтение»
Чтение и запись в созданный файл производится с помощью функций read() и write().
Пример
mkfifo.c
Мы открываем файл только для чтения (O_RDONLY). И могли бы использовать O_NONBLOCK модификатор, предназначенный специально для FIFO файлов, чтобы не ждать когда с другой стороны файл откроют для записи. Но в приведенном коде такой способ неудобен.
Компилируем программу, затем запускаем ее:
В соседнем терминальном окне выполняем:
В результате мы увидим следующий вывод от программы:
Разделяемая память
Следующий тип межпроцессного взаимодействия — разделяемая память (shared memory). Схематично изобразим ее как некую именованную область в памяти, к которой обращаются одновременно два процесса:
Для выделения разделяемой памяти будем использовать POSIX функцию shm_open():
Функция возвращает файловый дескриптор, который связан с объектом памяти. Этот дескриптор в дальнейшем можно использовать другими функциями (к примеру, mmap() или mprotect()).
Целостность объекта памяти сохраняется, включая все данные связанные с ним, до тех пор пока объект не отсоединен/удален (shm_unlink()). Это означает, что любой процесс может получить доступ к нашему объекту памяти (если он знает его имя) до тех пор, пока явно в одном из процессов мы не вызовем shm_unlink().
Переменная oflag является побитовым «ИЛИ» следующих флагов:
- O_RDONLY — открыть только с правами на чтение
- O_RDWR — открыть с правами на чтение и запись
- O_CREAT — если объект уже существует, то от флага никакого эффекта. Иначе, объект создается и для него выставляются права доступа в соответствии с mode.
- O_EXCL — установка этого флага в сочетании с O_CREATE приведет к возврату функцией shm_open ошибки, если сегмент общей памяти уже существует.
Как задается значение параметра mode подробно описано в предыдущем параграфе «передача сообщений».
После создания общего объекта памяти, мы задаем размер разделяемой памяти вызовом ftruncate(). На входе у функции файловый дескриптор нашего объекта и необходимый нам размер.
Пример
Следующий код демонстрирует создание, изменение и удаление разделяемой памяти. Так же показывается как после создания разделяемой памяти, программа выходит, но при следующем же запуске мы можем получить к ней доступ, пока не выполнен shm_unlink().
shm_open.c
После создания объекта памяти мы установили нужный нам размер shared memory вызовом ftruncate(). Затем мы получили доступ к разделяемой памяти при помощи mmap(). (Вообще говоря, даже с помощью самого вызова mmap() можно создать разделяемую память. Но отличие вызова shm_open() в том, что память будет оставаться выделенной до момента удаления или перезагрузки компьютера.)
Компилировать код на этот раз нужно с опцией -lrt:
Смотрим что получилось:
Аргумент «create» в нашей программе мы используем как для создания разделенной памяти, так и для изменения ее содержимого.
Зная имя объекта памяти, мы можем менять содержимое разделяемой памяти. Но стоит нам вызвать shm_unlink(), как память перестает быть нам доступна и shm_open() без параметра O_CREATE возвращает ошибку «No such file or directory».
Семафор
Семафор — самый часто употребляемый метод для синхронизации потоков и для контролирования одновременного доступа множеством потоков/процессов к общей памяти (к примеру, глобальной переменной). Взаимодействие между процессами в случае с семафорами заключается в том, что процессы работают с одним и тем же набором данных и корректируют свое поведение в зависимости от этих данных.
Есть два типа семафоров:
- семафор со счетчиком (counting semaphore), определяющий лимит ресурсов для процессов, получающих доступ к ним
- бинарный семафор (binary semaphore), имеющий два состояния «0» или «1» (чаще: «занят» или «не занят»)
Рассмотрим оба типа семафоров.
Семафор со счетчиком
Смысл семафора со счетчиком в том, чтобы дать доступ к какому-то ресурсу только определенному количеству процессов. Остальные будут ждать в очереди, когда ресурс освободится.
Итак, для реализации семафоров будем использовать POSIX функцию sem_open():
В функцию для создания семафора мы передаем имя семафора, построенное по определенным правилам и управляющие флаги. Таким образом у нас получится именованный семафор.
Имя семафора строится следующим образом: в начале идет символ "/" (косая черта), а следом латинские символы. Символ «косая черта» при этом больше не должен применяться. Длина имени семафора может быть вплоть до 251 знака.
Если нам необходимо создать семафор, то передается управляющий флаг O_CREATE. Чтобы начать использовать уже существующий семафор, то oflag равняется нулю. Если вместе с флагом O_CREATE передать флаг O_EXCL, то функция sem_open() вернет ошибку, в случае если семафор с указанным именем уже существует.
Параметр mode задает права доступа таким же образом, как это объяснено в предыдущих главах. А переменной value инициализируется начальное значение семафора. Оба параметра mode и value игнорируются в случае, когда семафор с указанным именем уже существует, а sem_open() вызван вместе с флагом O_CREATE.
Для быстрого открытия существующего семафора используем конструкцию:
, где указываются только имя семафора и управляющий флаг.
Пример семафора со счетчиком
Рассмотрим пример использования семафора для синхронизации процессов. В нашем примере один процесс увеличивает значение семафора и ждет, когда второй сбросит его, чтобы продолжить дальнейшее выполнение.
sem_open.c
В одной консоли запускаем:
В соседней консоли запускаем:
Бинарный семафор
Вместо бинарного семафора, для которого так же используется функция sem_open, я рассмотрю гораздо чаще употребляемый семафор, называемый «мьютекс» (mutex).
Мьютекс по существу является тем же самым, чем является бинарный семафор (т.е. семафор с двумя состояниями: «занят» и «не занят»). Но термин «mutex» чаще используется чтобы описать схему, которая предохраняет два процесса от одновременного использования общих данных/переменных. В то время как термин «бинарный семафор» чаще употребляется для описания конструкции, которая ограничивает доступ к одному ресурсу. То есть бинарный семафор используют там, где один процесс «занимает» семафор, а другой его «освобождает». В то время как мьютекс освобождается тем же процессом/потоком, который занял его.
Без мьютекса не обойтись в написании, к примеру базы данных, к которой доступ могут иметь множество клиентов.
Для использования мьютекса необходимо вызвать функцию pthread_mutex_init():
Функция инициализирует мьютекс (перемнную mutex) аттрибутом mutexattr. Если mutexattr равен NULL, то мьютекс инициализируется значением по умолчанию. В случае успешного выполнения функции (код возрата 0), мьютекс считается инициализированным и «свободным».
Типичные ошибки, которые могут возникнуть:
- EAGAIN — недостаточно необходимых ресурсов (кроме памяти) для инициализации мьютекса
- ENOMEM — недостаточно памяти
- EPERM — нет прав для выполнения операции
- EBUSY — попытка инициализировать мьютекс, который уже был инициализирован, но не унечтожен
- EINVAL — значение mutexattr не валидно
Чтобы занять или освободить мьютекс, используем функции:
Функция pthread_mutex_lock(), если mutex еще не занят, то занимает его, становится его обладателем и сразу же выходит. Если мьютекс занят, то блокирует дальнейшее выполнение процесса и ждет освобождения мьютекса.
Функция pthread_mutex_trylock() идентична по поведению функции pthread_mutex_lock(), с одним исключением — она не блокирует процесс, если mutex занят, а возвращает EBUSY код.
Фунция pthread_mutex_unlock() освобождает занятый мьютекс.
Коды возврата для pthread_mutex_lock():
- EINVAL — mutex неправильно инициализирован
- EDEADLK — мьютекс уже занят текущим процессом
Коды возврата для pthread_mutex_trylock():
- EBUSY — мьютекс уже занят
- EINVAL — мьютекс неправильно инициализирован
Коды возврата для pthread_mutex_unlock():
- EINVAL — мьютекс неправильно инициализирован
- EPERM — вызывающий процесс не является обладателем мьютекса
Пример mutex
mutex.c
Данный пример демонстрирует совместный доступ двух потоков к общей переменной. Один поток (первый поток) в автоматическом режиме постоянно увеличивает переменную counter на единицу, при этом занимая эту переменную на целую секунду. Этот первый поток дает второму доступ к переменной count только на 10 миллисекунд, затем снова занимает ее на секунду. Во втором потоке предлагается ввести новое значение для переменной с терминала.
Если бы мы не использовали технологию «мьютекс», то какое значение было бы в глобальной переменной, при одновременном доступе двух потоков, нам не известно. Так же во время запуска становится очевидна разница между pthread_mutex_lock() и pthread_mutex_trylock().
Компилировать код нужно с дополнительным параметром -lpthread:
Запускаем и меняем значение переменной просто вводя новое значение в терминальном окне:
Вместо заключения
В следующих статьях я хочу рассмотреть технологии d-bus и RPC. Если есть интерес, дайте знать.
Спасибо.
UPD: Обновил 3-ю главу про семафоры. Добавил подглаву про мьютекс.
Многие пользователи локальных сетей часто не подозревают что их диски являются сетевыми ресурсами к которым можно подключится, упоминаются как скрытые административные и общие ресурсы C$, ADMIN$, FAX$, IPC$, PRINT$. Их нужно отключить если они вам не нужны!
Виды общих сетевых ресурсов в Windows XP/200
По умолчанию в Windows XP/2000 могут быть созданы следующие скрытые административные общие ресурсы:
- корневые разделы или тома C$ (D$, E$, F$ и т.д.);
- корневой каталог операционной системы ADMIN$;
- общий ресурс FAX$;
- общий ресурс IPC$;
- общий ресурс PRINT$.
Для корневых разделов и томов в качестве имени общего ресурса используется имя диска, к которому добавляется символ «$». Например, для доступа к дискам C и D будут созданы общие ресурсы C$ и D$ .
Корневой каталог операционной системы ( %SYSTEMROOT% ) – это каталог, в котом установлена операционная система Windows. Общий ресурс ADMIN$ предоставляет администраторам доступ к этой папке по сети.
Общий ресурс FAX$ используется пользователями для отправки факсов. В этой папке кэшируются файлы и титульные страницы, находящиеся на файловом сервере.
Общий ресурс IPC$ используется при организации временных подключений, создаваемых приложениями для обмена данными с помощью именованных каналов. Как правило, он применяется для удаленного администрирования серверов в сети.
Общий ресурс PRINT$ используется для удаленного администрирования принтеров.
Если удалить скрытые административные ресурсы, созданные операционной системой (например, ADMIN$ или C$), то после перезагрузки компьютера или перезапуска службы «Сервер» они будут созданы повторно. Если удалить скрытые административные ресурсы, созданные пользователями, то после перезагрузки компьютера они повторно созданы не будут. Microsoft Windows XP Home Edition не создает скрытые административные общие ресурсы.
Подключение к общим сетевым ресурсам в Windows XP/2000
Для подключения к скрытым административным и общим сетевым ресурсам можно использовать стандартную команду Windows XP/2000 net use :
Команда net use используется для подключения и отключения от сетевых ресурсов и для вывода сведений о текущих подключениях к таким ресурсам. Если сетевой ресурс является текущим диском или его использует какое-либо работающее приложение, отключиться от такого ресурса невозможно.
Ниже приводится пример использования команды net use для подключения к стандартному общему ресурсу C$ , компьютера под управлением Windows 2000, с полным именем Pro2000 , расположенного в локальной сети:
Команда net use выполнена успешно под именем пользователя Администратор и пустым паролем! В большинстве случаев после установки Windows, пароль на учетную запись с именем Администратор, создаваемую по умолчанию, забывают или просто не хотят ставить, а бывает так, что во время установки создавалась другая административная учетная запись, а учетная запись с именем Администратор, созданная по умолчанию, осталась без внимания!
Далее мы можем делать с этим ресурсом практически всё что нашей душе будет угодно, C$ ассоциирован с какой либо свободной буквой диска, в нашем случае это q:
После подключения ресурса C$ и его ассоциации с буквой диска, ресурс C$ будет доступен в вашем проводнике и с ним можно будет работать так, как с обычным локальным диском, ну, а дальше всё будет зависеть от ваших способностей и фантазии.
ВНИМАНИЕ. Общие ресурсы будут доступны только в том случае когда включена/запущена служба "Сервер", а если вы не собираетесь расшаривать свои ресурсы, то лучше её не просто остановить, а отключить совсем. Служба "Сервер" — Обеспечивает поддержку общий доступ к файлам, принтерам и именованным каналам для данного компьютера через сетевое подключение. Если служба остановлена, такие функции не удастся выполнить. Если данная служба неразрешена, не удастся запустить любые явно зависимые службы.
Приведённый выше пример наглядно демонстрирует уязвимость неприкрытых сетевых ресурсов и учетной записи Администратор, созданную по умолчанию с пустым паролем! Во избежание образования подобных щелей и как результат регулярной переустановки Windows с последующим преданием анафеме Билла Гейтса нужно просто изначально прикрывать, так сказать, все щели и дыры.
Отключение/удаление общих сетевых ресурсов
Самый простой способ это отключить службу "Сервер", но, некоторые службы и программы нуждаются в её поддержке, в таком случае отключение службы "Сервер" нам не подходит.
Для отключения административных и общих сетевых ресурсов (C$, ADMIN$, FAX$, IPC$, PRINT$) в Windows XP/2000 нужно добавить в рестр два параметра AutoShareServer и AutoShareWks типа REG_DWORD со значением 0, в ветку реестра HKEY_LOCAL_MACHINESystemCurrentControlSetServicesLanmanServerParameters и перезагрузить ПК.
ПРИМЕЧАНИЕ! В Windows 2000 параметр AutoShareWks добавлять не требуется.
После перезагрузки ПК будут удалены все общие сетевые ресурсы, за исключением одного IPC$ , его нельзя удалить:
Особый общий ресурс IPC$
Представляет собой ресурс совместного доступа к именованным каналам, которые обеспечивают связь между программами. Используется для удаленного администрирования компьютера и для просмотра общих ресурсов компьютера. Этот ресурс нельзя удалить.
Особый общий ресурс IPC$ обязателен для работы службы серверов и не может быть удален. Просмотреть список текущих общих сетевых ресурсов можно командой net share
Повторимся, что воизбежание образования щелей в общих сетевых ресурсах и как результат регулярной переустановки Windows с последующим преданием анафеме Билла Гейтса нужно просто изначально прикрывать, так сказать, все щели и дыры.





