ReadFile висит на канале чтения - PullRequest
0 голосов
/ 23 апреля 2019

Я использую CreateProcess() для запуска cmd.exe (без физического отображения окна для пользователя) и мне нужно обработать вывод.Я решил использовать CreatePipe() для этой цели.

В настоящее время у меня возникла проблема, из-за которой весь мой вывод читается и обрабатывается, но последний вызов ReadFile() зависает.Поиск вокруг сказал мне, что мне нужно закрыть сторону записи канала перед чтением, и что это решение этой проблемы, но я уже сделал это и все еще имею проблему.

Вот мойкод:

// sw -> path to cmd.exe, ptr is the command
ok = CreateProcess(sw, ptr, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &StartupInfo, &ProcessInfo);
CloseHandle(hStdInPipeRead);
char buf[1024 + 1] = {};
DWORD dwRead = 0;
DWORD dwAvailable = 0;
DWORD testRes;
CloseHandle(hStdOutPipeWrite);
ok = ReadFile(hStdOutPipeRead, buf, 1024, &dwRead, NULL);
// String handling for initial read omitted for clarity
string temp = buf;
bool holdOff = false;

while (ok == TRUE)
{
    buf[dwRead] = '\0';
    OutputDebugStringA(buf);
    puts(buf);
    // ReadFile gets all the correct output from cmd here but it also hangs on the very last call. How to fix?
    ok = ReadFile(hStdOutPipeRead, buf, 1024, &dwRead, NULL);
    temp = buf;
    // handle and store output
    break;
}
CloseHandle(hStdOutPipeRead);
CloseHandle(hStdInPipeWrite);

1 Ответ

0 голосов
/ 24 апреля 2019

Дочерний процесс наследует дескриптор канала, если вы установите SECURITY_ATTRIBUTES.bInheritHandle = true, дескриптор записи закрытого канала - только родительский, в дочернем процессе все еще есть дескриптор (stdout of child), и он не имеет t был закрыт в процессе cihld, Readfile завершается неудачно и возвращается только тогда, когда все дескрипторы записи закрыты или возникают ошибки.

Кроме того, Операции с анонимными трубами .

Асинхронные (перекрытые) операции чтения и записи не поддерживаются по анонимным каналам (Создать CreatePipe).

Итак, если вам все еще нужно отправить команду дочернему процессу для выполнения cmd, вы должны поместить ReadFile в поток. И если вам больше не нужно, завершите дочерний процесс:

TerminateProcess(ProcessInfo.hProcess,0);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
ok = ReadFile(hStdOutPipeRead, buf, 1024, &dwRead, NULL);
// String handling for initial read omitted for clarity
string temp = buf;
bool holdOff = false;
while (ok == TRUE)
{
    buf[dwRead] = '\0';
    OutputDebugStringA(buf);
    puts(buf);
    // ReadFile gets all the correct output from cmd here but it also hangs on the very last call. How to fix?
    ok = ReadFile(hStdOutPipeRead, buf, 1024, &dwRead, NULL);
    temp = buf;
    // handle and store output
    break;
}
CloseHandle(hStdOutPipeRead);
CloseHandle(hStdInPipeWrite);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...