Windows создание именованного канала

Содержание
  1. Национальная библиотека им. Н. Э. Баумана Bauman National Library
  2. Персональные инструменты
  3. Именованный канал
  4. Содержание
  5. Структура
  6. Именованные каналы в UNIX
  7. Именованный канал в Windows
  8. Именованные каналы в сетях Windows
  9. Создание, подключение и именование каналов и почтовых ящиков
  10. Читайте также
  11. Создание именованных каналов
  12. Подключение клиентов именованных каналов
  13. Подключение клиентов и серверов именованных каналов
  14. Использование почтовых ящиков
  15. 11.4.1. Создание входных точек устройств и именованных каналов
  16. 11.6. Создание неименованных каналов
  17. Несколько почтовых ящиков или пользователей в одной программе
  18. 2.3. Создание и открытие каналов IPC
  19. 3.4. Создание и открытие каналов IPC
  20. Чистильщик почтовых ящиков – POP3 Cleaner
  21. 5.4.1. Создание каналов
  22. 4.1.10. Структура почтовых ящиков
  23. Урок 3.4. Электронная почта. Создание и настройка почтовых ящиков
  24. Практическая работа 22. Создание, отправка и прием почтовых сообщений
  25. Межпроцессный обмен
  26. Организация каналов в ОC Windows
  27. Анонимные каналы
  28. Прогон программы общения процесса через анонимный канал с самим собой
  29. Прогон программы общения через анонимный канал клиента и сервера
  30. Именованные каналы
  31. Использование именованных каналов
  32. Прогон программы общения двух процессов через именованный канал
  33. Заключение

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Именованный канал

Именованный канал или именованный конвейер (англ. named pipe ) — один из методов межпроцессного взаимодействия, расширение понятия конвейера в UNIX и подобных ОС. Именованный канал позволяет различным процессам обмениваться данными, даже если программы, выполняющиеся в этих процессах, изначально не были написаны для взаимодействия с другими программами. Это понятие также существует и в Microsoft Windows, хотя там его семантика существенно отличается. Традиционный канал — «безымянен», потому что существует анонимно и только во время выполнения процесса. Именованный канал — существует в системе и после завершения процесса. Он должен быть «отсоединён» или удалён, когда уже не используется. Процессы обычно подсоединяются к каналу для осуществления взаимодействия между ними.

Содержание

Структура

Для создания именованных каналов будем использовать функцию, mkfifo() :

Функция создает специальный FIFO файл с именем pathname, а параметр mode задает права доступа к файлу.

Примечание:
mode используется в сочетании с текущим значением /code>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().

Мы открываем файл только для чтения (O_RDONLY). И могли бы использовать O_NONBLOCK модификатор, предназначенный специально для FIFO файлов, чтобы не ждать когда с другой стороны файл откроют для записи. Но в приведенном коде такой способ неудобен.

Компилируем программу, затем запускаем ее:

В соседнем терминальном окне выполняем:

В результате мы увидим следующий вывод от программы:

Именованные каналы в UNIX

При необходимости передачи информации из одного процесса передавалась в другой, достаточно передать выводимые данные одного процесса на вход другого. Чтобы обеспечить эффект присутствия в файловой системе, из которой один процесс может осуществить связь с другим, как раз и предназначены именованные каналы и сокеты. Именованные каналы обычно используются для осуществления связи между процессами, в то время как сокеты – для обеспечения связи в сети.

Так же существуют именованные каналы, которые так же иногда называют FIFO, что означает “First In, First Out”. Тебе, как программисту, это должно быть понятно: первым вошёл, первым вышел. Этот принцип относится абсолютно ко всем байтам данным, попадающим в именованный канал. Каналы хранятся как файлы в файловой системе. Таким образом, “имя” такого канала – имя файла. И это вполне логично, т.к. всем известно, что в ОС UNIX любой элемент может быть отображен в виде файла, включая устройства и наши именованные каналы.

Читайте также:  Не удалось найти файл сценария c windows run vbs что

Таким образом, посмотреть список каналов можно командой ls. Ранее для создания именованных каналов использовалась утилита mknod. Сейчас же стандартом является mkfifo. Синтаксис использования достаточно прост. Нужно лишь передать программе имя, которое будет носить именованный канал.

Буква “p”, что подчеркнута красным, как раз и означает, что тип этого файла – именованный канал.

Теперь пришло время посмотреть, как же работает запись и извлечение данных. Т.к. канал уже создан, то обменяемся между двумя консолями списком файлов и поддиректорий текущей директории.

Это – самый простой пример работы именованного канала. Откроем первую консоль и напишем в ней:

Теперь открываем вторую консоль и переходим в эту же директорию. Выполняем:

Вуаля! И мы видим список файлов и поддиректорий нашей папки. (см. рис. 3) Интересной особенностью является то, что порядок выполнения команд не имеет значения. Т.е. можно сначала выполнить чтение из канала, а только потом подать команду записи в него. Результат будет один. После приёма первой команды будет выполняться “ожидание” второй команды.

Такой способ очень прост и эффективен для взаимодействия двух разных процессов. Допустим, что у нас существует сервер, который ожидает приёма данных (например, данные для печати), открыв канал для чтения. Клиенту лишь нужно будет подать команду на запись данных в пайп. Печать начнётся сразу же по окончанию записи данных клиентом.

Именованный канал в Windows

В Windows дизайн именованных каналов смещён к взаимодействию «клиент-сервер», и они работают во многом как сокеты: помимо обычных операций чтения и записи, именованные каналы в Windows поддерживают явный «пассивный» режим для серверных приложений (для сравнения: сокет домена UNIX). Windows 95 поддерживает клиенты именованных каналов, а системы ветви Windows NT могут служить также и серверами.

К именованному каналу можно обращаться в значительной степени как к файлу. Можно использовать функции Windows API CreateFile, CloseHandle, ReadFile, WriteFile, чтобы открывать и закрывать канал, выполнять чтение и запись. Функции стандартной библиотеки Си, такие, как fopen, fread, fwrite и fclose, тоже можно использовать, в отличие от сокетов Windows (англ.), которые не реализуют использование стандартных файловых операций в сети. Интерфейс командной строки (как в Unix) отсутствует.

Именованные каналы — не существуют постоянно и не могут, в отличие от Unix, быть созданы как специальные файлы в произвольной доступной для записи файловой системе, но имеют временные имена (освобождаемые после закрытия последней ссылки на них), которые выделяются в корне файловой системы именованных каналов (англ. named pipe filesystem, NPFS) и монтируются по специальному пути «\\.\pipe\» (то есть у канала под названием «foo» полное имя будет «\\.\pipe\foo»). Анонимные каналы, использующиеся в конвейерах, — это на самом деле именованные каналы со случайным именем.

Именованные каналы обычно не доступны непосредственно пользователю, но есть существенные исключения. Например, средство виртуализации рабочих станций VMWare может открывать эмулируемый последовательный порт для главной системы как именованный канал, а отладчик уровня ядра kd от Microsoft поддерживает именованные каналы в качестве средства сообщения при отладке (фактически, так как kd обычно требует подключения к целевому компьютеру по последовательному порту, VMware и kd можно соединить вместе для отладки драйверов устройств на одном компьютере). Обе программы требуют от пользователя указания имён канала в виде «\\.\pipe\имя».

Именованные каналы в Windows NT могут наследовать контекст безопасности.

Именованные каналы в сетях Windows

Именованные каналы — это также сетевой протокол в SMB, основанный на использовании особой части межпроцессного взаимодействия (IPC). IPC в SMB может бесшовно и прозрачно передавать контекст аутентификации пользователя на другую сторону именованного канала. Наследование аутентификации для именованных каналов Windows NT для пользователя и разработчика настолько прозрачно, что почти незаметно, в связи с чем его часто неправильно понимают.

Создание, подключение и именование каналов и почтовых ящиков

Создание, подключение и именование каналов и почтовых ящиков

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

Аналогичная информация для почтовых ящиков приведена в табл. 11.2. Вспомните, что почтовый клиент (или сервер) не обязательно должен выполняться тем же процессом или даже на той же системе, что и клиент (или сервер) приложения.

Таблица 11.1. Именованные каналы: создание, подключение и именование

Клиент приложения Сервер приложения Дескриптор именованного канала или соединение CreateFile CallNamedPipe TransactNamedPipe CreateNamedPipe Имя канала \.имя канала (канал является локальным) \имя системыимя канала (канал является локальным или удаленным) \.имя канала (канал создается локальным)

Таблица 11.2. Почтовые ящики: создание, подключение и именование

Почтовый клиент Почтовый сервер Дескриптор почтового ящика CreateFile CreateMailslot Имя почтового ящика \.имя почтового ящика (почтовый ящик является локальным) \имя системыимя почтового ящика (почтовый ящик располагается на указанной удаленной системе) \*имя почтового ящика (все почтовые ящики, имеющие одно и то же указанное имя) \.имя почтового ящика (почтовый ящик создается локальным)

Читайте также:  En softonic com windows

Читайте также

Создание именованных каналов

Создание именованных каналов Серверами именованных каналов могут быть только системы на основе Windows NT (как обычно, здесь имеются в виду версия 4.0 и последующие); системы на базе Windows 9x могут выступать только в роли клиентов.Прототип функции CreateNamedPipe представлен ниже. HANDLE

Подключение клиентов именованных каналов

Подключение клиентов именованных каналов Как показано на рис. 11.2, для подключения клиента к именованному каналу применяется функция CreateFile, при вызове которой указывается имя именованного канала. Часто клиент и сервер выполняются на одном компьютере, и в этом случае для

Подключение клиентов и серверов именованных каналов

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

Использование почтовых ящиков

Использование почтовых ящиков Рассмотренный перед этим клиент-серверный процессор командной строки предполагает несколько возможных способов его использования. Рассмотрим один из сценариев, в котором решается задача обнаружения сервера в только что упомянутой

11.4.1. Создание входных точек устройств и именованных каналов

11.4.1. Создание входных точек устройств и именованных каналов Процессы создают файлы устройств и именованных каналов в файловой системе с помощью вызова mknod().#include #include int mknod(const char *pathname, mode_t mode, dev_t dev);pathname — это имя файла, который нужно создать, mode — это и

11.6. Создание неименованных каналов

11.6. Создание неименованных каналов Неименованные каналы подобны именованным, но они в файловой системе не существуют. Они не имеют путевых имен, ассоциированных с ними, и все они и их следы исчезают после того, как последний файловый дескриптор, ссылающийся на них,

Несколько почтовых ящиков или пользователей в одной программе

Несколько почтовых ящиков или пользователей в одной программе Рассмотрим случаи, когда у вас зарегистрировано несколько электронных ящиков, а также когда программой Outlook Express хотят пользоваться несколько человек.Сначала разберемся с несколькими ящиками. Для каждого из

2.3. Создание и открытие каналов IPC

2.3. Создание и открытие каналов IPC Все три функции, используемые для создания или открытия объектов IPC: mq_open, sem_open и shm_open, — принимают специальный флаг oflag в качестве второго аргумента. Он определяет параметры открытия запрашиваемого объекта аналогично второму аргументу

3.4. Создание и открытие каналов IPC

3.4. Создание и открытие каналов IPC Три функции getXXX, используемые для создания или открытия объектов IPC (табл. 3.1), принимают ключ IPC (типа key_t) в качестве одного из аргументов и возвращают целочисленный идентификатор. Этот идентификатор отличается от того, который

Чистильщик почтовых ящиков – POP3 Cleaner

Чистильщик почтовых ящиков – POP3 Cleaner С помощью этой небольшой и простой в использовании программы вы сможете предварительно просмотреть и удалить нежелательные почтовые сообщения прямо на сервере. Очистка происходит вручную или с использованием «черного» списка

5.4.1. Создание каналов

5.4.1. Создание каналов Канал создается с помощью функции pipe(). Ей необходимо передать массив из двух целых чисел. В элементе с индексом 0 функция сохраняет дескриптор файла, соответствующего выходному концу канала, а в элементе с индексом 1 сохраняется дескриптор файла,

4.1.10. Структура почтовых ящиков

4.1.10. Структура почтовых ящиков На рис. 4.30 приведен пример организации почтовых ящиков на Боковой панели приложения Mail. Рассмотрим каждый раздел подробнее. Раздел ЯщикиЕсли вы создали несколько учетных записей, то папки, расположенные в разделе Ящики (Mailboxes), являются

Урок 3.4. Электронная почта. Создание и настройка почтовых ящиков

Урок 3.4. Электронная почта. Создание и настройка почтовых ящиков Общие сведения об электронной почте Электронная почта – одна из наиболее давних и популярных услуг Интернета. Она позволяет пользователям Сети обмениваться текстовыми сообщениями и пересылать файлы

Практическая работа 22. Создание, отправка и прием почтовых сообщений

Практическая работа 22. Создание, отправка и прием почтовых сообщений Эту работу лучше выполнять вместе с коллегой или знакомым, чтобы можно было обмениваться электронными письмами. Если же у вас нет такой возможности, придется отправлять письма самому себе.Задание 1.

Межпроцессный обмен

Организация каналов в ОC Windows

Анонимные каналы

Анонимные каналы в Windows — это полудуплексное средство потоковой передачи байтов между родственными процессами. Они функционируют в пределах локальной вычислительной системы и хорошо подходят для перенаправления выходного потока одной программы на вход другой. Анонимные каналы реализованы при помощи именованных каналов с уникальными именами.

Анонимные каналы создаются процессом сервером при помощи функции CreatePipe :

Читайте также:  Как сделать другого пользователя администратором windows 10

Функция CreatePipe возвращает два описателя (дескриптора) для чтения и записи в канал. После создания канала необходимо передать клиентскому процессу эти дескрипторы (или один из них), что обычно делается с помощью механизма наследования.

Для наследования описателя нужно, чтобы дочерний процесс создавался функцией CreateProcess с флагом наследования TRUE . Предварительно нужно создать наследуемые описатели. Это можно, например, сделать путем явной спецификации параметра bInheritHandle структуры SECURITY_ATTRIBUTES при создании канала.

Другим способом является создание наследуемого дубликата имеющегося описателя при помощи функции DuplicateHandle и последующая передача его создаваемому процессу через командную строку или каким-либо иным образом.

Получив нужный описатель, клиентский процесс, так же как и сервер, может далее взаимодействовать с каналом при помощи функций ReadFile и WriteFile . По окончании работы с каналом оба процесса должны закрыть описатели при помощи функции CloseHandle .

Прогон программы общения процесса через анонимный канал с самим собой

В приведенной программе создается анонимный канал, в него записывается строка цифр, затем часть этой строки читается и выводится на экран.

Прогон программы общения через анонимный канал клиента и сервера

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

Именованные каналы

Именованные каналы являются объектами ядра ОС Windows, позволяющими организовать межпроцессный обмен не только в изолированной вычислительной системе, но и в локальной сети. Они обеспечивают дуплексную связь и позволяют использовать как потоковую модель , так и модель, ориентированную на сообщения. Обмен данными может быть синхронным и асинхронным.

Каналы должны иметь уникальные в рамках сети имена в соответствии с правилами именования ресурсов в сетях Windows (Universal Naming Convention , UNC), например, \\ServerName\pipe\PipeName . Для общения внутри одного компьютера имя записывается в форме \\.\pipe\PipeName , где «.» обозначает локальную машину. Слово «pipe» в составе имени фиксировано, а PipeName — имя, задаваемое пользователем. Эти имена, подобно именам открытых файлов, не являются именами объектов. Они относятся к пространству имен под управлением драйверов файловых систем именованных каналов ( \Winnt\System32\Drivers\Npfs.sys ), привязанному к специальному объекту устройству \Device\NamedPipe , на которое есть ссылка в каталоге глобальных имен объектов \??\Pipe (эти последние имена «видит» утилита WinObj).

Имена созданных именованных каналов можно перечислить с помощью свободно распространяемой утилиты pipelist с сайта http://www.sysinternals.com. Поскольку имена каналов интегрированы в общую структуру имен объектов, приложения могут открывать именованные каналы с помощью функции CreateFile и взаимодействовать с ними через функции ReadFile и WriteFile .

Использование именованных каналов

Сервер создает именованный канал при помощи функции CreateNamedPipe (см. MSDN).

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

Повторно вызывая CreateNamedPipe , можно создавать дополнительные экземпляры этого же канала.

После вызова CreateNamedPipe сервер выполняет вызов ConnectNamedPipe и ждет отклика от клиентов, которые соединяются с каналом при помощи функции CreateFile или CallNamedPipe , указывая при вызове имя созданного сервером канала. Легальный клиент получает описатель, представляющий клиентскую сторону именованного канала , и работа серверной функции ConnectNamedPipe на этом завершается.

После того как соединение по именованному каналу установлено, клиент и сервер могут использовать его для чтения и записи данных через Win32-функции ReadFile и WriteFile .

Прогон программы общения двух процессов через именованный канал

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

В данном примере сервер создает канал, затем запускает процесс-клиент и ждет соединения. Далее он читает сообщение, посланное клиентом.

Помимо перечисленных выше система представляет еще ряд полезных функций для работы с именованными каналами. Для копирования данных из именованного канала без удаления их из канала используется функция PeekNamedPipe . Функция TransactNamedPipe применяется для объединения операций чтения и записи в канал в одну операцию, которая называется транзакцией. Имеются информационные функции для определения состояния канала, например, GetNamedPipeHandleState или GetNamedPipeInfo . Полный перечень находится в MSDN.

Заключение

Организация совместной деятельности и общения процессов является важной и актуальной задачей. К основным способам межпроцессного обмена традиционно относят каналы и разделяемую память , для организации которых используют разделяемые ресурсы. Анонимные каналы поддерживают потоковую модель , в рамках которой данные представляют собой неструктурированную последовательность байтов. Именованные каналы, поддерживающие как потоковую модель , так и модель, ориентированную на сообщения, обеспечивают обмен данными не только в изолированной вычислительной среде, но и в локальной сети.

Оцените статью