Re: cmd.exe and pipes

From
Alex Fedotov ()
To
Alex Shakhajlo ()
Date
2001-06-30T06:27:47Z
Area
SU.WINDOWS.NT.PROG
From: "Alex Fedotov" <alexf@3cube.com>

Alex Shakhajlo wrote:

> Не запускал ли кто командный пpоцессоp с пеpеназначением вывода
> на пайпы ? Пpоблема возникает пpи чтении пайпа, когда данные
> заканчиваются, readfile не возвpащает упpавления (пайп анонимный).

Запускал. Имел эту проблему. Ты имеешь в виду, что когда cmd.exe
завершается, ReadFile остается висеть вечно?

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

Другими словами, надо делать так:

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

HANDLE hRead, hWrite;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
    ...

STARTUPINFO si;
memset(&si, 0, sizeof(si));

si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = ...;
si.hStdOutput = hWrite;
si.hStdError = ...;

if (!CreateProcess(NULL, pszCmdLine, NULL, NULL,
    TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
    ...

CloseHandle(hWrite);  // <--

while (ReadFile(hRead, ...))
{
     ...
}

--
Alex Fedotov


Отправлено через сервер Talk.Ru - http://www.talk.ru
--- ifmail v.2.15dev5
 * Origin: 3Cube, Inc. (www.3cube.com) (2:5020/400)