На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Anonymous Pipes Overview



A typical use of an anonymous pipe is to create a channel for communication between a parent process and its child process by redirecting the standard input or standard output handles of the child process. To redirect the standard output handle of a child process, the parent process performs the following steps:

1. Call the GetStdHandle function to get the current standard output handle; save the handle for later use.
2. Call the CreatePipe function to create an anonymous pipe. This function returns handles to the read and write ends of the pipe.
3. Call the SetStdHandle function to set its standard output to be the write handle of the pipe.
4. Call the CreateProcess function to create the child process. The child process inherits the inheritable handles of the parent process. It also inherits the values of the standard handles of its parent process, which it can retrieve using the GetStdHandle function.

5. Call the CloseHandle function to close the parent's handle to the write end of the pipe. After the child process inherits this handle, the parent process no longer needs its copy of the handle.
6. Call the ReadFile function to read from the pipe. This operation enables the parent process to read the data written to standard output by the child process.



The child process uses the GetStdHandle function to get its standard output handle, which is actually a handle to the write end of the pipe. The child process then uses the WriteFile function to write its output to the pipe.
Data is written to an anonymous pipe as a stream of bytes. This means that a process reading from a pipe cannot distinguish between the bytes written in separate write operations, unless both reading and writing processes use some protocol that lets the reading process know how many bytes to read. Typically, there is no protocol, so the reading process reads from the pipe until all write handles to the pipe are closed, which causes the ReadFile function to return FALSE. When a child process's standard output is redirected, the child process calls CloseHandle or terminates (which automatically closes the handle). Note that it is important for the parent process to close its handle to the write end of the pipe before trying to read from the pipe. Otherwise, its ReadFile operation cannot return FALSE because there is still an open handle to the write end of the pipe.

The procedure for redirecting standard input is similar to that for redirecting standard output, except that the pipe's read handle is used for the child's standard input. In this case, the parent process must ensure that the child process does not inherit the pipe's write handle. Otherwise, the ReadFile operation of the child process cannot return FALSE because the child process has an open handle to the write end of the pipe.
The parent process typically creates the read and write handles to the pipe so that they can be inherited by a child process. It does this by using CreatePipe, specifying a SECURITY_ATTRIBUTES structure with the bInheritHandle member set to TRUE. When a child's standard input is redirected, the child process should not inherit the pipe's write handle. The parent process prevents inheritance by using the DuplicateHandle function to create a noninheritable duplicate of the handle and then using CloseHandle to close the inheritable handle.

For an example program that uses anonymous pipes to redirect the standard handles of a child process, see Processes and Threads.


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Анонимный Обзор Труб



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

1. Назовите функцию GetStdHandle, чтобы получать текущую стандартную выходную ручку; сохраните ручку для последующего использования.
2. Назовите функцию CreatePipe, чтобы создавать анонимную трубу. Эта функция возвращает ручкам на чтение и концы записи трубы.
3. Назовите функцию SetStdHandle, чтобы устанавливать свой стандартный выход, чтобы быть писать ручкой трубы.
4. Назовите функцию CreateProcess, чтобы создавать процесс ребенка. Процесс ребенка наследует ручки inheritable родительского процесса. Это также наследует величины стандартных ручек своего родительского процесса, какое это может извлечь используя функцию GetStdHandle.

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



Процесс ребенка использует функцию GetStdHandle, чтобы получать свою стандартную выходную ручку, которая - действительно ручка в записывать конец трубы. Процесс ребенка затем использует функцию WriteFile, чтобы записывать свой выход в трубу.
Данные записаны в анонимную трубу как поток байтов. Это означает, что процесс, читающийся из трубы не может различиться между байтами записанными в отдельных операциях записи, если как чтение так и использование процессов записи некоторого протокола, которые не позволяют, чтобы процесс чтения знает, что сколько байтов прочитают. Обычно, нет протокола, так что процесс чтения читается из трубы пока все ручки записи в трубу не будут закрыты, который заставляет функцию ReadFile, чтобы возвращать ЛОЖЬ. Когда процесс ребенка стандартного выхода переназначен, процесс ребенка называет CloseHandle или завершает (какие автоматически закрытия ручка). Отметьте, что важно для родительского процесса закрывать свою ручку в записывать конец трубы прежде чем попытаться читаться из трубы. В противном случае, операция ReadFile не может возвращать ЛОЖЬ поскольку есть все еще открытая ручка в записывать конец трубы.

Процедура чтобы переназначать стандартный ввод подобное, что чтобы переназначать стандартный выход, кроме того труба прочитавшее ручку использован для стандартного ввода ребенка. В этом случае, родительский процесс должен проверить, что процесс ребенка не наследует записывать ручку трубы. В противном случае, операция ReadFile процесса ребенка не может возвращать ЛОЖЬ поскольку процесс ребенка имеет открытую ручку в записывать конце трубы.
Родительский процесс обычно создает чтение и записывает ручки в трубу чтобы они могут быть унаследованы процессом ребенка. Это делает с помощью использования CreatePipe, определение структуры SECURITY_ATTRIBUTES с элементом bInheritHandle было установлено в ИСТИНУ. Когда стандартный ввод ребенка переназначен, процесс ребенка не должен наследовать записывать ручку трубы. Родительский процесс предохраняет наследство используя функцию DuplicateHandle, чтобы создавать noninheritable дубликат ручки и затем используя CloseHandle, чтобы закрывать ручку inheritable.

Для программы примера, которая использует анонимные трубы, чтобы переназначать стандартные ручки процесса ребенка, смотри Процессы и Резьбу.


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz