我正在使用Microsoft示例如何使用句柄向父进程传递调用的进程中的数据。ReadFromFile C++具有未知字节读取大小
这里是我的createChild所功能
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//output file for hash rate
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &sa, 0);
SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdInput = NULL;
si.hStdError = g_hChildStd_OUT_Wr;
si.hStdOutput = g_hChildStd_OUT_Wr;
si.wShowWindow = SW_HIDE;
int success;
success = CreateProcess((appPath + L"\\" + processName + L".exe").c_str(),
cmdArgs,
NULL,
NULL,
TRUE,
CREATE_NO_WINDOW,
NULL,
appPath.c_str(),
&si,
&pi)
;
//}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
孩子一旦被创建它永远不会终止。只要PC正在运行,它就会运行并将输出发送到父级。
父母每五分钟调用一次该函数来获取缓冲区。
void Helpers::ReadFromPipe(CHAR* chBuf)
{
DWORD dwRead, dwWritten;
BOOL bSuccess = FALSE;
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
for (;;)
{
bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, 4096, &dwRead, NULL);
if (!bSuccess || dwRead == 0) break;
bSuccess = WriteFile(hParentStdOut, chBuf,
dwRead, &dwWritten, NULL);
if (!bSuccess) break;
}
return;
}
有时会起作用,有时候不起作用。 当它卡在for循环中是因为我设置了一个字节来读取太高?
我调用的进程写了5行文本,大约100字节左右。但是每行的行数是不同的,所以我不能100%确定要读取数字的字节数。
在调试器中逐行执行代码。 *哪里“卡住”? –
你是怎么打开'g_hChildStd_OUT_Rd'句柄的?您可以调查“OVERLAPPED”模式和“PIPE_NOWAIT”以使用异步方法。 – Gonmator
不,这个问题不太可能是由读取太多字节引起的。 (那么,除非缓冲区不够大?)但是我认为休止条件是错误的;零字节读取不是“管道末端”状况。我最好的猜测是你没有把你的手柄关在管子的末端。但我们需要[mcve]来确保。 –