ПредишенСледващото

Създаване на дете процес за да се припише входа и на изхода

Пример Този раздел показва как да се създаде дъщерен процес на процес на конзола. Той също демонстрира техника за използване на неназовани канала програма за пренасочване на стандартния вход и изход описания процес дете.

Функцията използва CreatePipe SECURITY_ATTRIBUTES структура. да се създаде наследствена дръжки да четат и пишат в краищата на двата канала. четене край в един от каналите служи като стандарт за въвеждане на данни за процеса на дете и в края на запис в другия канал е стандартен изход за процеса на дете. Тези канали дръжка е настроен да SetStdHandle функция. което ги прави стандартни описания, наследени от процеса на дете. След като дъщерен процес, създаден, SetStdHandle отново се използва за възстановяване на оригиналните стандартни описания за процеса на родител.

Процесът на майка използва другия край на канала за запис на записи и прочетете изхода на данните на процеса дете. То се извършва изцяло от тези канали също са наследствени. Въпреки това, на дръжката не трябва да се наследява. Преди създаването на дете процес, процесът на родител трябва да използвате DuplicateHandle. да създадете копие на заявлението определена глобална променлива hChildStdinWr един. които не могат да бъдат наследени. След това той използва CloseHandle. за затваряне на наследствена дръжката. За повече информация виж гл. Channels.

По-долу - процес майка.

#defineBUFSIZE 4096

МАНИПУЛАЦИИ hChildStdinRd, hChildStdinWr, hChildStdinWrDup,

hChildStdoutRd, hChildStdoutWr, hChildStdoutRdDup,

hInputFile, hSaveStdin, hSaveStdout;

BOOLCreateChildProcess (свободен);

VOIDReadFromPipe (свободен);

// Задаване на флага bInheritHandle, както описания на канала са наследени.

saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);

// Стъпки за пренасочване STDOUT процес дете

// 1.Sohranim ток STDOUT, която по-късно се възстанови.

// 2. Създаване на анонимен канал, за да бъде дете процес STDOUT.

// 3. Задайте процес STDOUT родител, който,

// рекорд канал ЕВРОВОК наследен от процеса на дете.

// 4. Създаване unheritable дубликат четене и затваряне на дескриптора

// наследствено чете ЕВРОВОК.

// съхранява текущата ЕВРОВОК стандартния изход.

hSaveStdout = GetStdHandle (STD_OUTPUT_HANDLE);

// Създаване на канал STDOUT дъщерен процес.

ако (! CreatePipe (hChildStdoutRd, hChildStdoutWr, saAttr, 0))

ErrorExit ( "стандартния изход създаване тръба не е \ п");

// Задаване на канал дескриптора на запис, който е STDOUT.

ако (! SetStdHandle (STD_OUTPUT_HANDLE. hChildStdoutWr))

ErrorExit ( "Пренасочване STDOUT провали");

// Създаване unheritable дръжка четене и затворете наследил прочетете дескриптора.

fSuccess = DuplicateHandle (GetCurrentProcess (), hChildStdoutRd,

GetCurrentProcess (), hChildStdoutRdDup. 0

ErrorExit ( "DuplicateHandle провали");

// Стъпки за пренасочване на STDIN на процеса на дете:

// 1.Sohranim ток STDIN, която по-късно се възстанови.

// 2. Създаване на анонимен канал, за да бъде STDIN на процеса на дете.

// 3. Задайте стандартния вход на процеса на родител, който ще се справи

// прочетете канал, така че той е наследен от процеса на дете.

// 4. Създаване unheritable записи дубликат ЕВРОВОК близо

// наследствено ЕВРОВОК запис.

// съхранява текущата ЕВРОВОК стандартния вход.

hSaveStdin = GetStdHandle (STD_INPUT_HANDLE);

// Създаване на канал STDIN дъщерен процес.

ако (! CreatePipe ( hChildStdinRd, hChildStdinWr, saAttr, 0))

ErrorExit ( "стандартния вход създаване тръба не е \ п");

// Задаване на четене Характеристиката на канала, който ще бъде STDIN.

ако (! SetStdHandle (STD_INPUT_HANDLE. hChildStdinRd))

ErrorExit ( "Пренасочване на стандартния вход се провали");

// справят Дублиращи се данни за канала, така че да не се наследява.

fSuccess = DuplicateHandle (GetCurrentProcess (), hChildStdinWr,

GetCurrentProcess (), hChildStdinWrDup, 0,

FALSE, // не се наследява

ErrorExit ( "DuplicateHandle провали");

// Сега се създаде процес на децата.

ErrorExit ( "Създаване на процеса се провали");

// След процеса на създаване, възстановяване на запазена стандартния вход и стандартния изход.

ако (! SetStdHandle (STD_INPUT_HANDLE. hSaveStdin))

ErrorExit ( "Re-пренасочване на стандартния вход се провали \ Н");

ако (! SetStdHandle (STD_OUTPUT_HANDLE. hSaveStdout))

ErrorExit ( "Re-пренасочване на стандартния изход се провали \ Н");

// Вземи дръжка на родителя, на входния файл.

hInputFile = CreateFile (argv [1], GENERIC_READ. 0, NULL,

OPEN_EXISTING. FILE_ATTRIBUTE_READONLY. NULL);

ако (hInputFile == INVALID_HANDLE_VALUE)

ErrorExit ( "без входен файл \ Н");

// Напишете в канала, който е стандартен за въвеждане на данни за детето

// чете от канал, който е стандартен за филиал терминал

Подкрепете проекта - споделете линка, благодаря!