Поиск по базе сайта:
Pipes (каналы) и разделяемая память icon

Pipes (каналы) и разделяемая память




Скачати 55.13 Kb.
НазваPipes (каналы) и разделяемая память
Дата конвертації06.01.2013
Розмір55.13 Kb.
ТипДокументи

Pipes (каналы) и разделяемая память.


Одним из методов межпроцессорного взаимодействия (Inter Process Communication - IPC) являются каналы (pipes). Канал является средством, с помощью которого можно производить обмен данными между процессом - источником и процессом - приемником этих данных. Процесс - источник записывает данные в канал, а процесс - приемник считывает данные, освобождая его для дальнейшего использования. Принцип работы с каналами основан на механизме ввода - вывода, который используется для работы с файлами, что упрощает работу с каналами. Но поскольку канал это все-таки не файл то при создании канала задается его емкость и тип пересылаемой информации (Binary OR Text).

Каналы подразделяются на два основных типа: неименованный канал и канал FIFO (First IN First OUT) или именованный канал.

Неименованные каналы используются для обмена данными между родственными процессами (потоками). При создание такого канала (int pipe(int* filedes) для UNIX или BOOL CreatePipe(PHANDLE hRPipe, PHANDLE hWPipe, LPSECURITY_ATTRIBUTES lpPipeAttribut, DWORD nSize ) для WINDOWS) возвращаются два файловых дескриптора: filedes[0] (hWPipe) для записи информации и filedes[1] (hRPipe) для чтения. Эти файловые дескрипторы доступны только в рамках родственных процессов, чем и ограничено применение неименованных каналов. Данный тип канала не поддерживает асинхронный режим доступа и использует Binary тип передаваемой информации.

Для чтения и записи информации в/из канала используются стандартные функции API (WINDOWS) для работы с файлами:


^ BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nSizeOfBuffer,

LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );

BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nSizeBuffer,

LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );


Последний параметр lpOverlapped при работе с неименованным каналом игнорируется. Для закрытия канала используется функция:


^ BOOL CloseHandle(HANDLE hObject );


В большинстве операционных систем неименованные каналы поддерживаются командной оболочной, обеспечивая передачу информации из одной программы (на стандартное устройство - терминал) в другую (прием информации со стандартного устройства - клавиатуры). В UNIX системах и OS/2 это достигается с помощью символа "|" при написании команды:


$ ps- sf | grep my_proc


>DIR | MORE


Для обеспечения передачи информации между не родственными процессами используются поименованные каналы. Основная проблема IPC - заключается в поддержке уникальности имен таких объектов. Так в WINDOWS рекомендовано имена каналов задавать в виде "\\servername\pipe\pipename" для доступа к каналу расположенному на машине " servername " и "\\.\pipe\pipename" для доступа к каналу расположенному на текущей машине (pipename - произвольное название канала).

При создании FIFO канала задается:

  1. тип обмениваемой через канал информации PIPE_TYPE_BYTE - передача данных типа Binary PIPE_TYPE_MESSAGE - типа Text;

  2. тип доступа к каналу ^ PIPE_ACCESS_INBOUND = GENERIC_READ (чтение), PIPE_ACCESS_OUTBOUND = GENERIC_WRITE (запись) или оба этих метода PIPE_ACCESS_DUPLEX = GENERIC_READ | GENERIC_WRITE (чтение/запись). При работе с удаленным сервером также используется тип FILE_FLAG_WRITE_THROUGH блокирующий окончание выполнения функции записи в канал до тех пор, пока они не будут переданы на удаленный компьютер с сервером канала. Для обеспечения асинхронной работы с каналом используют тип FILE_FLAG_OVERLAPPED;

  3. метод работы с каналом PIPE_WAIT - ожидание выполнения блокирующих операции (чтения/записи) PIPE_NOWAIT - выполнение не блокирующих операции (чтения/записи).


Для создания поименованного канала используется функция:


^ HANDLE CreateNamedPipe( LPCTSTR lpName, DWORD dwOpenMode,

DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufSize, DWORD nInBufSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes )


LPCTSTR lpName="\\\\.\\pipe\\test1"; имя канала

LPCTSTR lpName =( PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND, PIPE_ACCESS_DUPLEX ) | (FILE_FLAG_WRITE_THROUGH, FILE_FLAG_OVERLAPPED) | (WRITE_DAC, WRITE_OWNER, ACCESS_SYSTEM_SECURITY ); тип доступа и метод работы


^ DWORD dwPipeMode =( PIPE_TYPE_BYTE, PIPE_TYPE_MESSAGE) | (PIPE_WAIT, PIPE_NOWAIT);


DWORD nMaxInstances= PIPE_UNLIMITED_INSTANCES;

DWORD nOutBufSize=1024;

DWORD nInBufSize=1024;

DWORD nDefaultTimeOut = 10000; время в милисекундах


typedef struct _SECURITY_ATTRIBUTES {

DWORD nLength;

LPVOID lpSecurityDescriptor;

BOOL bInheritHandle;

} SECURITY_ATTRIBUTES;


DWORD nLength - sizeof(SECURITY_ATTRIBUTES)

LpSecurityDescriptor - дискриптор безопасности

BOOL bInheritHandle - признак наследования


typedef PVOID PSECURITY_DESCRIPTOR -определяет дескриптор безопасности


Для работы с созданным каналом используются функции:


^ BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nSizeOfBuffer,

LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );

BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nSizeBuffer,

LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );


BOOL ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesRead, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );

BOOL WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );


BOOL PeekNamedPipe( HANDLE hNamedPipe, LPVOID lpBuffer, DWORD nBufferSize, LPDWORD lpBytesRead, LPDWORD lpTotalBytesAvail, LPDWORD lpBytesLeftThisMessage );чтение без удаления


BOOL TransactNamedPipe( HANDLE hNamedPipe, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesRead, LPOVERLAPPED lpOverlapped ); Чтение/запись в одной транзакции


^ BOOL GetNamedPipeInfo(HANDLE hNamedPipe, LPDWORD lpFlags, LPDWORD lpOutBufferSize, LPDWORD lpInBufferSize,

LPDWORD lpMaxInstances );


BOOL GetNamedPipeHandleState(

HANDLE hNamedPipe, LPDWORD lpState, LPDWORD lpCurInstances, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout, LPTSTR lpUserName, DWORD nMaxUserNameSize );


^ BOOL SetNamedPipeHandleState( HANDLE hNamedPipe, LPDWORD lpMode,LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout );


BOOL FlushFileBuffers( HANDLE hFile );


BOOL DisconnectNamedPipe(HANDLE hNamedPipe );

BOOL CloseHandle( HANDLE hObject );


BOOL ConnectNamedPipe( HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped );

Каналы работают, используя следующие принципы:


  1. При чтении меньшего числа байт из канала, чем в нем находится, возвращается требуемое число байт, а остальные хранятся в канале;

  2. При чтении большего числа байт из канала возвращается доступное число байт и указатель на действительно прочитанное число байт;

  3. При чтении из пустого канала возвращается 0 байт. При использовании блокирующих функций READ блокируется до появления данных.

  4. Запись данных объемом меньшим, чем объем канала выполняется атомарно.

  5. Запись данных объемом большим, чем объем канала блокируем операцию WRITE до освобождения места в канале. Если канал не открыт ни одним процессом на чтение, генерируется сигнал SIGPIPE.



^

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



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

Для уменьшения затрат ОС на обслуживание таких архитектур используется понятие разделяемой памяти. Взаимодействие с объектом “разделяемая память” строится, как правило, на архитектуре ввода – вывода файловой системы и возможности отображения данного объекта в виртуальное пространство использующих его процессов.

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



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





Для создания такого объекта


HANDLE CreateFileMapping(HANDLE hFile (-1), LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName );

^ HANDLE OpenFileMapping(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName);

LPVOID MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD wNumberOfBytesToMap);

BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);


Вопросы по теме:


  1. Каналы (Pipes). Назначение и принципы организации. Достоинства и недостатки неименованных каналов.

  2. Достоинства и недостатки именованных каналов. Синхронный и асинхронный режим работы с каналом (функции API).

  3. Режим работы OVERLAPPED. Его назначение преимущества и недостатки. Схема использования данного режима при работе с каналом.

  4. Разделяемая память процессов. Архитектура реализации и назначение разделяемой памяти.


Приложение:


СЕРВЕР


#include

#include

#include

#define FIFO "pipe_1"

#define BUFF 1024


void main()

{

int read_pipes, n;

char buff[BUFF];

if(mknod(FIFO, S_IFIFO|666,0)<0)

{printf("Невозможно создать канал \n");exit(1);}

if((read_pipes=open(FIFO, O_RDONLY))<0)

{printf("Невозможно открыть канал \n");exit(1);}

while ((n=read(read_pipes, buff, BUFF)>0)

{

write(1, buff,n);

}

close(read_pipes);

exit(0);

}


КЛИЕНТ

#include

#include

#include

#define FIFO "pipe_1"

#define BUFF 1024

void main()

{

int write_pipes, n;

if((write_pipes=open(FIFO, O_WRONLY)) < 0)

{printf("Невозможно открыть канал \n");exit(1);}

write(write_pipes,"1111",4);

close(write_pipes);

unlink(FIFO);

exit(0);

}



Схожі:




База даних захищена авторським правом ©lib.exdat.com
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації