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)