如何解决程序具有大量输出时,挂起带有cmd.exe的CreateProcess
我正在使用CreateProcess
通过自定义命令调用cmd.exe
:
#include <Windows.h>
#include <stdio.h>
int main() {
HANDLE stdout_w = NULL;
HANDLE stdout_r = NULL;
SECURITY_ATTRIBUTES sattr = { 0 };
sattr.nLength = sizeof(SECURITY_ATTRIBUTES);
sattr.bInheritHandle = TRUE;
if (!CreatePipe(&stdout_r,&stdout_w,&sattr,0))
return EXIT_FAILURE;
SetHandleInformation(stdout_r,HANDLE_FLAG_INHERIT,0);
PROCESS_INFORMATION pi = { 0 };
STARTUPINFOA si = { 0 };
si.cb = sizeof(si);
si.hStdError = stdout_w;
si.hStdOutput = stdout_w;
si.dwFlags = STARTF_USESTDHANDLES;
char command[256];
strcpy_s(command,_countof(command),"cmd /S /C \"ag \"ch\"\"");
if (!CreateProcessA(NULL,command,NULL,TRUE,"c:/users/lisa/projects/monkey",&si,&pi))
return EXIT_FAILURE;
while (true) {
switch (WaitForSingleObject(pi.hProcess,0)) {
case WAIT_TIMEOUT:
break;
case WAIT_OBJECT_0:
return EXIT_SUCCESS;
default:
return EXIT_FAILURE;
}
}
}
在这里,我正在使用命令cmd.exe
调用ag "ch"
。 (ag
是一种实用程序,用于在文件中搜索字符串,类似于grep
。)
问题是,它正在挂起-循环永远运行,我可以看到创建的cmd.exe
进程在任务管理器中保持打开状态。关于此的一些奇怪的事情:
- 当我直接从命令提示符运行
cmd.exe /S /C "ag "ch""
时,它可以正常工作并按预期退出。 - 当我更改代码以运行
ag "chi"
(即搜索更大的子字符串)时,它会按预期退出。另外,当我将目录更改为没有任何文件的文件夹时,它也会按预期退出。这使我认为问题是ag
的输出太长。 - 当我直接将
ag "ch"
命令传递给CreateProcess
时,它按预期退出。 (不幸的是,我无法执行此操作,因为它是一个更大的实用程序的一部分,该实用程序允许我从C运行任何批处理命令,包括使用管道。)
任何人都知道这里发生了什么吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。