WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте
Схема взаимодействия процессов с помощью неименованного канала в Unix.

Неименованный канал (англ. anonymous pipe) — один из методов межпроцессного взаимодействия (IPC) в операционной системе, который доступен связанным процессам — родительскому и дочернему. Представляется в виде области памяти на внешнем запоминающем устройстве, управляемой операционной системой, которая осуществляет выделение взаимодействующим процессам частей из этой области памяти для совместной работы. Организация данных в канале использует стратегию FIFO, то есть информация, которая первой записана в канал, будет первой прочитана из канала.

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

Двустороннее взаимодействие между процессами обычно требует наличия двух неименованных каналов.

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

Для создания неименованного канала используется системный вызов pipe. Массив из двух целых чисел является выходным параметром этого системного вызова. Если вызов выполнился нормально, то массив содержит два файловых дескриптора: для чтения информации из канала и для записи в него соответственно. Когда процесс порождает другой процесс, дескрипторы родителя наследуются дочерним процессом, и, таким образом, осуществляется связь между двумя процессами. Один из них использует канал только для чтения, а другой — только для записи. Поэтому, если, например, через канал должны передаваться данные из родительского процесса в дочерний, родительский процесс сразу после запуска дочернего процесса закрывает дескриптор канала для чтения, а дочерний процесс закрывает дескриптор для записи. Если нужен двунаправленный обмен данными, то родительский процесс создает два канала, один из которых используется для передачи данных в одну сторону, а другой — в другую.

Для записи информации в канал используется системный вызов write. Для чтения информации из канала — системный вызов read. Первый аргумент этих вызовов — дескриптор канала, имеющий тип int, второй — указатель на область памяти, с которой происходит обмен, имеет тип void, третий — количество байт, целочисленный тип. Оба вызова возвращают число переданных байт (либо значение «-1» при ошибке). При завершении использования канала процесс выполняет системный вызов close.

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

Как и множество других методов межпроцессного взаимодействия, неименованные каналы создаются и конфигурируются с помощью функций Windows API. CreatePipe используется для создания неименованного канала. Данная функция возвращает два дескриптора (для чтения и записи в канал соответственно). Для того, чтобы дочерний процесс наследовал дескрипторы, необходимо создавать его функцией CreateProcess с флагом наследования TRUE. Получив нужный дескриптор, процесс может далее взаимодействовать с каналом при помощи функций ReadFile и WriteFile, обеспечивающих чтение информации из канала и запись информации в канал соответственно. По окончании работы с каналом оба процесса должны закрыть дескрипторы при помощи функции CloseHandle.

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

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

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии