【发布时间】:2016-10-06 03:54:06
【问题描述】:
我正在尝试创建一个子进程并使用 Windows 管道与它异步通信,然后在子进程生成输出时将其输出重定向到主进程的 cout。 这是我现在的代码:
HANDLE hWriteOUT, hReadOUT, hWriteIN, hReadIN;
SECURITY_ATTRIBUTES saPipe = { 0 };
PROCESS_INFORMATION procInfo = { 0 };
STARTUPINFO procSi;
DWORD dwWritten, dwRead;
int bufsize = 6000;
char buf[6000];
saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saPipe.bInheritHandle = TRUE;
saPipe.lpSecurityDescriptor = NULL;
CreatePipe(&hReadOUT, &hWriteOUT, &saPipe, 0);
SetHandleInformation(hReadOUT, HANDLE_FLAG_INHERIT, 0);
CreatePipe(&hReadIN, &hWriteIN, &saPipe, 0);
SetHandleInformation(hWriteIN, HANDLE_FLAG_INHERIT, 0);
ZeroMemory(&procSi, sizeof(STARTUPINFO));
procSi.cb = sizeof(STARTUPINFO);
procSi.hStdError = hWriteOUT;
procSi.hStdOutput = hWriteOUT;
procSi.hStdInput = hReadIN;
procSi.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(
NULL,
(LPSTR) "app.exe",
NULL, NULL, TRUE, 0, NULL, NULL, &procSi, &procInfo);
WriteFile(hWriteIN, "go movetime 1000\n", strlen("go movetime 1000\n"),
&dwWritten, NULL);
auto start = clock();
auto seconds = 1.5;;
do {
Sleep(500);
cout << "cycle..." << endl;
buf[0]=char(NULL);
ReadFile(hReadOUT, buf, bufsize, &dwRead, NULL);
cout << buf;
//loop for 1.5 seconds = 3 cycles
} while ((double(clock() - start) / ((double) CLOCKS_PER_SEC)) < seconds);
问题在于连续读取似乎没有按顺序访问信息。如果我简化输出,那么不要像这样:
循环... 1 2 3 循环... 4 5 6 循环... 7 8 完成!
我看到了类似的东西:
循环... 1 2 3 循环... 4 2 3 循环... 8 完毕! 4
输出的某些部分丢失,有些被跳过! 如果我摆脱 for 循环并在更长的延迟后只读取一次,我确实会得到预期的结果。
我假设我的子进程不断将内容转储到管道中的事实使 ReadFile 应该保留的偏移量无效。 解决办法是什么?
【问题讨论】:
标签: c++ windows asynchronous process pipe