|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Anonymous Pipes
An anonymous pipe is an unnamed, one-way pipe that transfers data between a parent process and a child process or between two child processes of the same parent process. Although it is possible to use anonymous pipes for communication between unrelated processes, it is easier to use named pipes for that purpose (for more information, see Named Pipes). Anonymous pipes are always local; they cannot be used for communication over a network.
The CreatePipe function creates an anonymous pipe and returns two handles, one to the read end and one to the write end of the pipe. The read handle has only read access to the pipe, and the write handle has only write access to the pipe. To communicate through the pipe, a handle to one of the ends must be passed to another process. Usually, this is done through inheritance; that is, a child process inherits a handle from its parent process. The inheritability of these handles is controlled by the creating process in the following ways:
· The CreatePipe function specifies a SECURITY_ATTRIBUTES structure. If the bInheritHandle member of this structure is TRUE, the handles can be inherited. · The DuplicateHandle function can change the inheritability of a pipe handle. This function enables a process to create a noninheritable duplicate of an inheritable pipe handle or to create an inheritable duplicate of a noninheritable pipe handle. · The CreateProcess function enables a parent process to specify whether the new child process will inherit all or none of the parent's inheritable handles.
When a child process inherits a handle, the system enables the process to access the pipe referred to by that handle. However, the parent process must communicate the handle value to the child process. Typically, this is done by using the SetStdHandle and GetStdHandle functions, which set and retrieve the standard handles (standard input, standard output, or standard error) of a process. The parent process can specify a pipe handle in a call to SetStdHandle before the child process is created. The current standard handles of the parent process are inherited by the child process. So, when the child process starts up, it can use the GetStdHandle function to retrieve the handle value. The parent process can change its own standard handles without affecting the standard handles of its existing child processes.
To read from the pipe, a process uses the read handle in a call to the ReadFile function. When a write operation of any number of bytes completes, the ReadFile call returns. The ReadFile call also returns when all handles to the write end of the pipe have been closed or if any errors occur before the read operation completes normally. To write to the pipe, a process uses the write handle in a call to the WriteFile function. WriteFile does not return until the specified number of bytes has been written or an error occurs. If the pipe's buffer is full and bytes remain to be written, WriteFile does not return until some other process or thread reads from the pipe, making more buffer space available. CreatePipe enables the creating process to specify a buffer size for the pipe, or it can use the default buffer size.
Asynchronous (overlapped) read and write operations are not supported for anonymous pipes. This means that the ReadFileEx and WriteFileEx functions cannot be used with anonymous pipes. The lpOverLapped parameter of the ReadFile and WriteFile functions is ignored when used with an anonymous pipe. An anonymous pipe exists until all handles to both read and write ends of the pipe are closed by the CloseHandle function.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Анонимные Трубы
Анонимная труба является безымянной, односторонней трубой, которая передает данным между родительским процессом и процесс ребенка или между двумя процессами ребенка того же самого родительского процесса. Хотя возможно должно использовать анонимные трубы для связи между не имеющими отношения процессами, это легче должно использовать поименованные трубы для этой цели (более подробно, смотри Поименованные Трубы). Анонимные трубы всегда локальные; они не могут быть использованы для связи над сетью.
Функция CreatePipe создает анонимную трубу и возвращает две ручки, один в конец чтения и один в записывать конец трубы. Ручка чтения только прочитала доступ к трубе, и записывать ручка имеет доступ только записи к трубе. Чтобы связываться через трубу, ручка в один из концов должна быть пройдена в другой процесс. Обычно, это сделан через наследство; то есть, процесс ребенка наследует ручку из своего родительского процесса. inheritability Этих ручек управлялся созданием процесса в следующих путях:
Функция CreatePipe определяет структуру SECURITY_ATTRIBUTES. Если элемент bInheritHandle этой структуры является ИСТИНОЙ, ручки могут быть унаследованы. Функция DuplicateHandle может изменить inheritability ручки трубы. Эта функция позволяет процесс, чтобы создавать noninheritable дубликат ручки трубы inheritable или, чтобы создавать дубликат inheritable noninheritable ручки трубы. Функция CreateProcess допустимые родительский процесс, чтобы определять унаследует новый процесс ребенка все или ни одно из родитель inheritable ручки.
Когда процесс ребенка наследует ручку, система позволяет процесс, чтобы иметь доступ к трубе отосланной, чтобы этой ручкой. Тем не менее, родительский процесс должен передать величину ручки в процесс ребенка. Обычно, это сделан посредством использования SetStdHandle и функции GetStdHandle, которые установлены и извлекают стандартные ручки (стандартный ввод, стандартный выход, или стандартная ошибка) процесса. Родительский процесс может определить ручку трубы на вызове на SetStdHandle прежде, чем процесс ребенка будет создан. Текущие стандартные ручки родительского процесса унаследованы процессом ребенка. Так, когда процесс ребенка запускает, он может использовать функцию GetStdHandle, чтобы извлекать величину ручки. Родительский процесс может изменить свои собственные стандартные ручки не влияя на стандартные ручки своих существующих процессов ребенка.
Чтобы читаться из трубы, процесс использует ручку чтения на вызове в функцию ReadFile. Когда записывать операция любого количества байтов завершается, возврат вызова ReadFile. Вызов ReadFile также возвращается когда все ручки в записывать конец трубы закрыты или если любые ошибки происходят прежде, чем операция чтения завершится нормально. Чтобы записываться в трубу, процесс использует записывать ручку на вызове в функцию WriteFile. WriteFile НЕ возвращается пока определенное количество байтов не записано или ошибка происходит. Если буфер трубы полный и байты остаются, чтобы записан, WriteFile не возвращается пока некоторый другой процесс или резьба не прочитаются из трубы, получение более буферное космическое доступное. CreatePipe ПОЗВОЛЯЕТ создание процесса, чтобы определять буферный размер для трубы, или это может использовать по умолчанию буферный размер.
Асинхронный (перекрытый) прочитанное и операции записи не поддерживаны для анонимных труб. Это означает, что ReadFileEx и функции WriteFileEx не могут быть использованы анонимными трубами. lpOverLapped Параметр ReadFile и функций WriteFile проигнорирован когда использовано анонимной трубой. Анонимная труба существует пока все ручки как на не были прочитаны так и концы записи трубы близко функция CloseHandle.
|
|
|
|
| |